diff --git a/presto-main-base/src/main/java/com/facebook/presto/FullConnectorSession.java b/presto-main-base/src/main/java/com/facebook/presto/FullConnectorSession.java index 44ba295923010..50d994875a1b0 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/FullConnectorSession.java +++ b/presto-main-base/src/main/java/com/facebook/presto/FullConnectorSession.java @@ -321,4 +321,10 @@ public ConnectorSession forConnectorId(ConnectorId connectorId) { return new FullConnectorSession(session, identity); } + + @Override + public Map getSystemProperties() + { + return session.getSystemProperties(); + } } diff --git a/presto-native-execution/presto_cpp/main/PrestoServer.cpp b/presto-native-execution/presto_cpp/main/PrestoServer.cpp index e501dba93125a..219a2c1b1be31 100644 --- a/presto-native-execution/presto_cpp/main/PrestoServer.cpp +++ b/presto-native-execution/presto_cpp/main/PrestoServer.cpp @@ -22,6 +22,7 @@ #include "presto_cpp/main/CoordinatorDiscoverer.h" #include "presto_cpp/main/PeriodicMemoryChecker.h" #include "presto_cpp/main/PeriodicTaskManager.h" +#include "presto_cpp/main/PrestoToVeloxQueryConfig.h" #include "presto_cpp/main/SignalHandler.h" #include "presto_cpp/main/TaskResource.h" #include "presto_cpp/main/common/ConfigReader.h" @@ -221,19 +222,24 @@ json::array_t getOptimizedExpressions( static constexpr char const* kTimezoneHeader = "X-Presto-Time-Zone"; const auto& timezone = httpHeaders.getSingleOrEmpty(kTimezoneHeader); - std::unordered_map config( - {{velox::core::QueryConfig::kSessionTimezone, timezone}, - {velox::core::QueryConfig::kAdjustTimestampToTimezone, "true"}}); - auto queryConfig = velox::core::QueryConfig{std::move(config)}; + + protocol::ExpressionOptimizationRequest request = + json::parse(util::extractMessageBody(body)); + + const std::map sessionProperties = + request.sessionProperties; + auto configs = toVeloxConfigsFromSessionProperties(sessionProperties); + configs.insert({velox::core::QueryConfig::kSessionTimezone, timezone}); + configs.insert( + {velox::core::QueryConfig::kAdjustTimestampToTimezone, "true"}); + + auto queryConfig = velox::core::QueryConfig{std::move(configs)}; auto queryCtx = velox::core::QueryCtx::create(executor, std::move(queryConfig)); - json input = json::parse(util::extractMessageBody(body)); - VELOX_USER_CHECK(input.is_array(), "Body of request should be a JSON array."); - const json::array_t expressionList = static_cast(input); std::vector expressions; - for (const auto& j : expressionList) { - expressions.push_back(j); + for (const auto& expr : request.expressions) { + expressions.push_back(expr); } const auto optimizedList = expression::optimizeExpressions( expressions, optimizerLevel, queryCtx.get(), pool); diff --git a/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.cpp b/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.cpp index e7e450ad15d97..773f4b9bddc10 100644 --- a/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.cpp +++ b/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.cpp @@ -44,12 +44,12 @@ void updateVeloxConfigsWithSpecialCases( } void updateFromSessionConfigs( - const protocol::SessionRepresentation& session, + const std::map& systemProperties, std::unordered_map& queryConfigs) { auto* sessionProperties = SessionProperties::instance(); std::optional traceFragmentId; std::optional traceShardId; - for (const auto& it : session.systemProperties) { + for (const auto& it : systemProperties) { if (it.first == SessionProperties::kQueryTraceFragmentId) { traceFragmentId = it.second; } else if (it.first == SessionProperties::kQueryTraceShardId) { @@ -72,6 +72,20 @@ void updateFromSessionConfigs( } } + // Construct query tracing regex and pass to Velox config. + // It replaces the given native_query_trace_task_reg_exp if also set. + if (traceFragmentId.has_value() || traceShardId.has_value()) { + queryConfigs[velox::core::QueryConfig::kQueryTraceTaskRegExp] = ".*\\." + + traceFragmentId.value_or(".*") + "\\..*\\." + + traceShardId.value_or(".*") + "\\..*"; + } +} + +void updateFromSessionConfigs( + const protocol::SessionRepresentation& session, + std::unordered_map& queryConfigs) { + updateFromSessionConfigs(session.systemProperties, queryConfigs); + if (session.startTime) { queryConfigs[velox::core::QueryConfig::kSessionStartTime] = std::to_string(session.startTime); @@ -92,15 +106,6 @@ void updateFromSessionConfigs( velox::core::QueryConfig::kSessionTimezone, velox::tz::getTimeZoneName(session.timeZoneKey)); } - - // Construct query tracing regex and pass to Velox config. - // It replaces the given native_query_trace_task_reg_exp if also set. - if (traceFragmentId.has_value() || traceShardId.has_value()) { - queryConfigs.emplace( - velox::core::QueryConfig::kQueryTraceTaskRegExp, - ".*\\." + traceFragmentId.value_or(".*") + "\\..*\\." + - traceShardId.value_or(".*") + "\\..*"); - } } void updateFromSystemConfigs( @@ -241,6 +246,14 @@ void updateFromSystemConfigs( } } // namespace +std::unordered_map +toVeloxConfigsFromSessionProperties( + const std::map& sessionProperties) { + std::unordered_map configs; + updateFromSessionConfigs(sessionProperties, configs); + return configs; +} + std::unordered_map toVeloxConfigs( const protocol::SessionRepresentation& session) { std::unordered_map configs; diff --git a/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.h b/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.h index 8e6b4cbf9261e..33d5c616bd41d 100644 --- a/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.h +++ b/presto-native-execution/presto_cpp/main/PrestoToVeloxQueryConfig.h @@ -40,6 +40,10 @@ velox::core::QueryConfig toVeloxConfigs( const protocol::SessionRepresentation& session, const std::map& extraCredentials); +std::unordered_map +toVeloxConfigsFromSessionProperties( + const std::map& sessionProperties); + std::unordered_map> toConnectorConfigs(const protocol::TaskUpdateRequest& taskUpdateRequest); diff --git a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.cpp b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.cpp index 809f5ee4a2267..25912edbb8dcb 100644 --- a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.cpp +++ b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.cpp @@ -5654,6 +5654,43 @@ void from_json(const json& j, ExecutionFailureInfo& p) { } } // namespace facebook::presto::protocol namespace facebook::presto::protocol { + +void to_json(json& j, const ExpressionOptimizationRequest& p) { + j = json::object(); + to_json_key( + j, + "expressions", + p.expressions, + "ExpressionOptimizationRequest", + "List>", + "expressions"); + to_json_key( + j, + "sessionProperties", + p.sessionProperties, + "ExpressionOptimizationRequest", + "Map", + "sessionProperties"); +} + +void from_json(const json& j, ExpressionOptimizationRequest& p) { + from_json_key( + j, + "expressions", + p.expressions, + "ExpressionOptimizationRequest", + "List>", + "expressions"); + from_json_key( + j, + "sessionProperties", + p.sessionProperties, + "ExpressionOptimizationRequest", + "Map", + "sessionProperties"); +} +} // namespace facebook::presto::protocol +namespace facebook::presto::protocol { FilterNode::FilterNode() noexcept { _type = ".FilterNode"; } diff --git a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.h b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.h index f5fa9ed15236b..17d2a79cf2b35 100644 --- a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.h +++ b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.h @@ -1351,6 +1351,14 @@ void to_json(json& j, const ExecutionFailureInfo& p); void from_json(const json& j, ExecutionFailureInfo& p); } // namespace facebook::presto::protocol namespace facebook::presto::protocol { +struct ExpressionOptimizationRequest { + List> expressions = {}; + Map sessionProperties = {}; +}; +void to_json(json& j, const ExpressionOptimizationRequest& p); +void from_json(const json& j, ExpressionOptimizationRequest& p); +} // namespace facebook::presto::protocol +namespace facebook::presto::protocol { struct FilterNode : public PlanNode { std::shared_ptr source = {}; std::shared_ptr predicate = {}; diff --git a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.yml b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.yml index 2036ea37a8d4b..5e59a543d79bd 100644 --- a/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.yml +++ b/presto-native-execution/presto_cpp/presto_protocol/core/presto_protocol_core.yml @@ -364,3 +364,4 @@ JavaClasses: - presto-spi/src/main/java/com/facebook/presto/spi/NodeLoadMetrics.java - presto-spi/src/main/java/com/facebook/presto/spi/session/SessionPropertyMetadata.java - presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/functionNamespace/NativeFunctionHandle.java + - presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/ExpressionOptimizationRequest.java diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/ExpressionOptimizationRequest.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/ExpressionOptimizationRequest.java new file mode 100644 index 0000000000000..b73fecb2a03b8 --- /dev/null +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/ExpressionOptimizationRequest.java @@ -0,0 +1,55 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.facebook.presto.sidecar.expressions; + +import com.facebook.presto.spi.relation.RowExpression; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import java.util.List; +import java.util.Map; + +import static java.util.Objects.requireNonNull; + +/** + * Request body wrapper for expression optimization that includes both expressions and session properties + */ +public class ExpressionOptimizationRequest +{ + private final List expressions; + private final Map sessionProperties; + + @JsonCreator + public ExpressionOptimizationRequest( + @JsonProperty("expressions") List expressions, + @JsonProperty("sessionProperties") Map sessionProperties) + { + this.expressions = ImmutableList.copyOf(requireNonNull(expressions, "expressions is null")); + this.sessionProperties = ImmutableMap.copyOf(requireNonNull(sessionProperties, "sessionProperties is null")); + } + + @JsonProperty + public List getExpressions() + { + return expressions; + } + + @JsonProperty + public Map getSessionProperties() + { + return sessionProperties; + } +} diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionsModule.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionsModule.java index d7d6b4dae75d1..57cc1a7817557 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionsModule.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeExpressionsModule.java @@ -56,7 +56,7 @@ public void configure(Binder binder) binder.install(new JsonModule()); jsonBinder(binder).addDeserializerBinding(RowExpression.class).to(RowExpressionDeserializer.class).in(Scopes.SINGLETON); jsonBinder(binder).addSerializerBinding(RowExpression.class).to(RowExpressionSerializer.class).in(Scopes.SINGLETON); - jsonCodecBinder(binder).bindListJsonCodec(RowExpression.class); + jsonCodecBinder(binder).bindJsonCodec(ExpressionOptimizationRequest.class); jsonCodecBinder(binder).bindListJsonCodec(RowExpressionOptimizationResult.class); binder.bind(NativeSidecarExpressionInterpreter.class).in(Scopes.SINGLETON); diff --git a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java index 484bb1cd1fd28..0ed5851cb6e21 100644 --- a/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java +++ b/presto-native-sidecar-plugin/src/main/java/com/facebook/presto/sidecar/expressions/NativeSidecarExpressionInterpreter.java @@ -57,7 +57,7 @@ public class NativeSidecarExpressionInterpreter private final NodeManager nodeManager; private final HttpClient httpClient; - private final JsonCodec> rowExpressionCodec; + private final JsonCodec expressionOptimizationRequestCodec; private final JsonCodec> rowExpressionOptimizationResultJsonCodec; @Inject @@ -65,12 +65,12 @@ public NativeSidecarExpressionInterpreter( @ForSidecarInfo HttpClient httpClient, NodeManager nodeManager, JsonCodec> rowExpressionOptimizationResultJsonCodec, - JsonCodec> rowExpressionCodec) + JsonCodec expressionOptimizationRequestCodec) { this.httpClient = requireNonNull(httpClient, "httpClient is null"); this.nodeManager = requireNonNull(nodeManager, "nodeManager is null"); this.rowExpressionOptimizationResultJsonCodec = requireNonNull(rowExpressionOptimizationResultJsonCodec, "rowExpressionOptimizationResultJsonCodec is null"); - this.rowExpressionCodec = requireNonNull(rowExpressionCodec, "rowExpressionCodec is null"); + this.expressionOptimizationRequestCodec = requireNonNull(expressionOptimizationRequestCodec, "expressionOptimizationRequestCodec is null"); } public Map optimizeBatch(ConnectorSession session, Map expressions, ExpressionOptimizer.Level level) @@ -120,9 +120,12 @@ public List optimize(ConnectorSession session, private Request getSidecarRequest(ConnectorSession session, Level level, List resolvedExpressions) { + ExpressionOptimizationRequest expressionOptimizationRequest + = new ExpressionOptimizationRequest(resolvedExpressions, session.getSystemProperties()); + return preparePost() .setUri(getSidecarLocation()) - .setBodyGenerator(jsonBodyGenerator(rowExpressionCodec, resolvedExpressions)) + .setBodyGenerator(jsonBodyGenerator(expressionOptimizationRequestCodec, expressionOptimizationRequest)) .setHeader(CONTENT_TYPE, JSON_UTF_8.toString()) .setHeader(ACCEPT, JSON_UTF_8.toString()) .setHeader(PRESTO_TIME_ZONE_HEADER, session.getSqlFunctionProperties().getTimeZoneKey().getId()) diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java index 6c49d1cbab361..046e83ae45862 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/TestNativeSidecarPlugin.java @@ -61,6 +61,7 @@ import static com.facebook.airlift.units.DataSize.Unit.MEGABYTE; import static com.facebook.presto.SystemSessionProperties.EXPRESSION_OPTIMIZER_NAME; +import static com.facebook.presto.SystemSessionProperties.FIELD_NAMES_IN_JSON_CAST_ENABLED; import static com.facebook.presto.SystemSessionProperties.INLINE_SQL_FUNCTIONS; import static com.facebook.presto.SystemSessionProperties.KEY_BASED_SAMPLING_ENABLED; import static com.facebook.presto.SystemSessionProperties.REMOVE_MAP_CAST; @@ -688,6 +689,7 @@ public void testNativeExpressionOptimizer() { Session session = Session.builder(getSession()) .setSystemProperty(EXPRESSION_OPTIMIZER_NAME, "native") + .setSystemProperty(FIELD_NAMES_IN_JSON_CAST_ENABLED, "true") .build(); // When using the native expression optimizer, the resolved optimized expression may contain a FunctionHandle. It is important that the correct type of function handle is constructed. @@ -734,6 +736,14 @@ public void testNativeExpressionOptimizer() // Test dereference expression with SQL invoked function, array_least_frequent. assertQuerySucceeds(session, "SELECT array_least_frequent(array_agg(orderkey)) from orders"); assertQuerySucceeds(session, "SELECT array_least_frequent(array_agg(nationkey)) from nation"); + + // Test session properties propagating through the optimizer + assertEquals( + computeActual(session, "SELECT JSON_FORMAT(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS JSON))"), + computeActual("select '{\"\":3,\"\":\"ab\"}'")); + assertEquals( + computeActual(session, "SELECT JSON_FORMAT(CAST(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS ROW(id BIGINT, name VARCHAR)) AS JSON))"), + computeActual("select '{\"id\":3,\"name\":\"ab\"}'")); } @Test diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionInterpreter.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionInterpreter.java index 0c390172ed90b..bae785da8dc99 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionInterpreter.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionInterpreter.java @@ -434,7 +434,7 @@ private NativeSidecarExpressionInterpreter getRowExpressionInterpreter(FunctionA newSetBinder(binder, BlockEncoding.class); jsonBinder(binder).addSerializerBinding(Block.class).to(BlockJsonSerde.Serializer.class); jsonBinder(binder).addDeserializerBinding(Block.class).to(BlockJsonSerde.Deserializer.class); - jsonCodecBinder(binder).bindListJsonCodec(RowExpression.class); + jsonCodecBinder(binder).bindJsonCodec(ExpressionOptimizationRequest.class); jsonCodecBinder(binder).bindListJsonCodec(RowExpressionOptimizationResult.class); httpClientBinder(binder).bindHttpClient("sidecar", ForSidecarInfo.class); diff --git a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionOptimizer.java b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionOptimizer.java index 1df9d84e123c7..08716837fa777 100644 --- a/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionOptimizer.java +++ b/presto-native-sidecar-plugin/src/test/java/com/facebook/presto/sidecar/expressions/TestNativeExpressionOptimizer.java @@ -13,6 +13,7 @@ */ package com.facebook.presto.sidecar.expressions; +import com.facebook.presto.Session; import com.facebook.presto.metadata.FunctionAndTypeManager; import com.facebook.presto.metadata.MetadataManager; import com.facebook.presto.operator.scalar.FunctionAssertions; @@ -30,6 +31,7 @@ import static com.facebook.airlift.testing.Closeables.closeAllRuntimeException; import static com.facebook.presto.SessionTestUtils.TEST_SESSION; +import static com.facebook.presto.SystemSessionProperties.FIELD_NAMES_IN_JSON_CAST_ENABLED; import static com.facebook.presto.metadata.MetadataManager.createTestMetadataManager; import static com.facebook.presto.sidecar.expressions.NativeExpressionOptimizerFactory.NAME; import static com.facebook.presto.sql.expressions.AbstractTestExpressionInterpreter.SYMBOL_TYPES; @@ -84,18 +86,53 @@ public void testLambdaBodyConstantFolding() "filter(transform(ARRAY[unbound_long, unbound_long2], x -> 2), x -> false)"); } + @Test + public void testSessionPropertiesPropagatingThroughOptimizer() + { + assertOptimizedEquals( + "JSON_FORMAT(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS JSON))", + "'[3,\"ab\"]'", + Session.builder(queryRunner.getDefaultSession()) + .setSystemProperty(FIELD_NAMES_IN_JSON_CAST_ENABLED, "false") + .build()); + assertOptimizedEquals( + "JSON_FORMAT(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS JSON))", + "'{\"\":3,\"\":\"ab\"}'", + Session.builder(queryRunner.getDefaultSession()) + .setSystemProperty(FIELD_NAMES_IN_JSON_CAST_ENABLED, "true") + .build()); + + assertOptimizedEquals( + "JSON_FORMAT(CAST(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS ROW(id BIGINT, name VARCHAR)) AS JSON))", + "'[3,\"ab\"]'", + Session.builder(queryRunner.getDefaultSession()) + .setSystemProperty(FIELD_NAMES_IN_JSON_CAST_ENABLED, "false") + .build()); + assertOptimizedEquals( + "JSON_FORMAT(CAST(CAST(ROW(1 + 2, CONCAT('a', 'b')) AS ROW(id BIGINT, name VARCHAR)) AS JSON))", + "'{\"id\":3,\"name\":\"ab\"}'", + Session.builder(queryRunner.getDefaultSession()) + .setSystemProperty(FIELD_NAMES_IN_JSON_CAST_ENABLED, "true") + .build()); + } + private void assertOptimizedEquals(@Language("SQL") String actual, @Language("SQL") String expected) { - RowExpression optimizedActual = optimize(actual, ExpressionOptimizer.Level.OPTIMIZED); - RowExpression optimizedExpected = optimize(expected, ExpressionOptimizer.Level.OPTIMIZED); + assertOptimizedEquals(actual, expected, TEST_SESSION); + } + + private void assertOptimizedEquals(@Language("SQL") String actual, @Language("SQL") String expected, Session session) + { + RowExpression optimizedActual = optimize(actual, ExpressionOptimizer.Level.OPTIMIZED, session); + RowExpression optimizedExpected = optimize(expected, ExpressionOptimizer.Level.OPTIMIZED, session); assertRowExpressionEvaluationEquals(optimizedActual, optimizedExpected); } - private RowExpression optimize(@Language("SQL") String expression, ExpressionOptimizer.Level level) + private RowExpression optimize(@Language("SQL") String expression, ExpressionOptimizer.Level level, Session session) { RowExpression parsedExpression = sqlToRowExpression(expression); Function variableResolver = variable -> null; - return expressionOptimizer.optimize(parsedExpression, level, TEST_SESSION.toConnectorSession(), variableResolver); + return expressionOptimizer.optimize(parsedExpression, level, session.toConnectorSession(), variableResolver); } private RowExpression sqlToRowExpression(String expression) diff --git a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java index 59e6a4bf08e08..a7cff74642c5f 100644 --- a/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java +++ b/presto-spi/src/main/java/com/facebook/presto/spi/ConnectorSession.java @@ -26,6 +26,8 @@ import java.util.Optional; import java.util.Set; +import static java.util.Collections.emptyMap; + public interface ConnectorSession { String getQueryId(); @@ -80,4 +82,9 @@ default Optional getConnectorId() { return Optional.empty(); } + + default Map getSystemProperties() + { + return emptyMap(); + } }