Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import com.facebook.presto.common.type.TypeManager;
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.HandleResolver;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.sql.analyzer.FeaturesConfig;
import com.facebook.presto.type.TypeDeserializer;
import com.google.common.collect.ImmutableList;
Expand Down
67 changes: 7 additions & 60 deletions presto-docs/src/main/sphinx/admin/properties.rst
Original file line number Diff line number Diff line change
Expand Up @@ -577,16 +577,16 @@ network has high latency or if there are many nodes in the cluster.
* **Type:** ``boolean``
* **Default value:** ``false``

Enables the use of custom connector-provided serialization codecs for handles.
Enables the use of custom connector-provided serialization codecs for handles.
This feature allows connectors to use their own serialization format for
handle objects (such as table handles, column handles, and splits) instead
of standard JSON serialization.

When enabled, connectors that provide a ``ConnectorCodecProvider`` with
appropriate codecs will have their handles serialized using custom binary
formats, which are then Base64-encoded for transport. Connectors without
codec support automatically fall back to standard JSON serialization.
Internal Presto handles (prefixed with ``$``) always use JSON serialization
When enabled, connectors that provide a ``ConnectorCodecProvider`` with
appropriate codecs will have their handles serialized using custom binary
formats, which are then Base64-encoded for transport. Connectors without
codec support automatically fall back to standard JSON serialization.
Internal Presto handles (prefixed with ``$``) always use JSON serialization
regardless of this setting.

.. _task-properties:
Expand Down Expand Up @@ -1242,57 +1242,4 @@ for cross-cluster retry operations.
Comma-separated list of error codes that allow cross-cluster retry. When a query
fails with one of these error codes, it can be automatically retried on a backup
cluster if a retry URL is provided. Available error codes include standard Presto
error codes such as ``REMOTE_TASK_ERROR``, ``CLUSTER_OUT_OF_MEMORY``, etc.

View and Materialized View Properties
-------------------------------------

``default-view-security-mode``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* **Type:** ``string``
* **Allowed values:** ``DEFINER``, ``INVOKER``
* **Default value:** ``DEFINER``

Sets the default security mode for views and materialized views when the ``SECURITY``
clause is not explicitly specified in ``CREATE VIEW`` or ``CREATE MATERIALIZED VIEW``
statements.

* ``DEFINER``: Views execute with the permissions of the user who created them
* ``INVOKER``: Views execute with the permissions of the user querying them

The corresponding session property is :ref:`admin/properties-session:\`\`default_view_security_mode\`\``.

``experimental.legacy-materialized-views``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* **Type:** ``boolean``
* **Default value:** ``true``

Use legacy materialized views implementation. Set to ``false`` to enable materialized
views with security modes (DEFINER and INVOKER), automatic query rewriting, and
freshness tracking.

The corresponding session property is :ref:`admin/properties-session:\`\`legacy_materialized_views\`\``.

.. warning::

Materialized views are experimental. The SPI and behavior may change in future releases.

``experimental.allow-legacy-materialized-views-toggle``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* **Type:** ``boolean``
* **Default value:** ``false``

Allow the ``legacy_materialized_views`` session property to be changed at runtime.
By default, the session property value is locked to the server configuration value
and cannot be changed per-session.

Set this to ``true`` to allow users to toggle between legacy and new materialized
views implementations using the session property. This is intended for testing and
migration purposes only.

.. warning::

This should only be enabled in non-production environments.
error codes such as ``REMOTE_TASK_ERROR``, ``CLUSTER_OUT_OF_MEMORY``, etc.
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@
import com.facebook.presto.hive.metastore.Storage;
import com.facebook.presto.hive.metastore.StorageFormat;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.HandleResolver;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.HostAddress;
import com.facebook.presto.spi.SplitWeight;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,16 @@
*/
package com.facebook.presto.connector;

import com.facebook.airlift.json.JsonCodec;
import com.facebook.presto.common.block.BlockEncodingSerde;
import com.facebook.presto.common.predicate.TupleDomain;
import com.facebook.presto.common.type.TypeManager;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.ConnectorSystemConfig;
import com.facebook.presto.spi.NodeManager;
import com.facebook.presto.spi.PageIndexerFactory;
import com.facebook.presto.spi.PageSorter;
import com.facebook.presto.spi.TupleDomainSerde;
import com.facebook.presto.spi.connector.ConnectorContext;
import com.facebook.presto.spi.function.FunctionMetadataManager;
import com.facebook.presto.spi.function.StandardFunctionResolution;
Expand All @@ -42,6 +46,7 @@ public class ConnectorContextInstance
private final FilterStatsCalculatorService filterStatsCalculatorService;
private final BlockEncodingSerde blockEncodingSerde;
private final ConnectorSystemConfig connectorSystemConfig;
private final TupleDomainSerde tupleDomainSerde;

public ConnectorContextInstance(
NodeManager nodeManager,
Expand All @@ -54,7 +59,8 @@ public ConnectorContextInstance(
RowExpressionService rowExpressionService,
FilterStatsCalculatorService filterStatsCalculatorService,
BlockEncodingSerde blockEncodingSerde,
ConnectorSystemConfig connectorSystemConfig)
ConnectorSystemConfig connectorSystemConfig,
JsonCodec<TupleDomain<ColumnHandle>> tupleDomainJsonCodec)
{
this.nodeManager = requireNonNull(nodeManager, "nodeManager is null");
this.typeManager = requireNonNull(typeManager, "typeManager is null");
Expand All @@ -67,6 +73,7 @@ public ConnectorContextInstance(
this.filterStatsCalculatorService = requireNonNull(filterStatsCalculatorService, "filterStatsCalculatorService is null");
this.blockEncodingSerde = requireNonNull(blockEncodingSerde, "blockEncodingSerde is null");
this.connectorSystemConfig = requireNonNull(connectorSystemConfig, "connectorSystemConfig is null");
this.tupleDomainSerde = new JsonCodecTupleDomainSerde(tupleDomainJsonCodec);
}

@Override
Expand Down Expand Up @@ -134,4 +141,10 @@ public ConnectorSystemConfig getConnectorSystemConfig()
{
return connectorSystemConfig;
}

@Override
public TupleDomainSerde getTupleDomainSerde()
{
return tupleDomainSerde;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
*/
package com.facebook.presto.connector;

import com.facebook.airlift.json.JsonCodec;
import com.facebook.airlift.log.Logger;
import com.facebook.airlift.node.NodeInfo;
import com.facebook.presto.common.CatalogSchemaName;
import com.facebook.presto.common.block.BlockEncodingSerde;
import com.facebook.presto.common.predicate.TupleDomain;
import com.facebook.presto.common.type.TypeManager;
import com.facebook.presto.connector.informationSchema.InformationSchemaConnector;
import com.facebook.presto.connector.system.DelegatingSystemTablesProvider;
Expand All @@ -33,6 +35,7 @@
import com.facebook.presto.metadata.InternalNodeManager;
import com.facebook.presto.metadata.MetadataManager;
import com.facebook.presto.security.AccessControlManager;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.ConnectorId;
import com.facebook.presto.spi.ConnectorSystemConfig;
import com.facebook.presto.spi.PageIndexerFactory;
Expand Down Expand Up @@ -127,6 +130,7 @@ public class ConnectorManager
private final BlockEncodingSerde blockEncodingSerde;
private final ConnectorSystemConfig connectorSystemConfig;
private final ConnectorCodecManager connectorCodecManager;
private final JsonCodec<TupleDomain<ColumnHandle>> tupleDomainJsonCodec;

@GuardedBy("this")
private final ConcurrentMap<String, ConnectorFactory> connectorFactories = new ConcurrentHashMap<>();
Expand Down Expand Up @@ -162,7 +166,8 @@ public ConnectorManager(
FilterStatsCalculator filterStatsCalculator,
BlockEncodingSerde blockEncodingSerde,
FeaturesConfig featuresConfig,
ConnectorCodecManager connectorCodecManager)
ConnectorCodecManager connectorCodecManager,
JsonCodec<TupleDomain<ColumnHandle>> tupleDomainCodec)
{
this.metadataManager = requireNonNull(metadataManager, "metadataManager is null");
this.catalogManager = requireNonNull(catalogManager, "catalogManager is null");
Expand All @@ -189,6 +194,7 @@ public ConnectorManager(
this.blockEncodingSerde = requireNonNull(blockEncodingSerde, "blockEncodingSerde is null");
this.connectorSystemConfig = () -> featuresConfig.isNativeExecutionEnabled();
this.connectorCodecManager = requireNonNull(connectorCodecManager, "connectorThriftCodecManager is null");
this.tupleDomainJsonCodec = requireNonNull(tupleDomainCodec, "tupleDomainCodec is null");
}

@PreDestroy
Expand Down Expand Up @@ -395,7 +401,8 @@ private Connector createConnector(ConnectorId connectorId, ConnectorFactory fact
new RowExpressionFormatter(metadataManager.getFunctionAndTypeManager())),
new ConnectorFilterStatsCalculatorService(filterStatsCalculator),
blockEncodingSerde,
connectorSystemConfig);
connectorSystemConfig,
tupleDomainJsonCodec);

try (ThreadContextClassLoader ignored = new ThreadContextClassLoader(factory.getClass().getClassLoader())) {
return factory.create(connectorId.getCatalogName(), properties, context);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* 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.connector;

import com.facebook.airlift.json.JsonCodec;
import com.facebook.presto.common.predicate.TupleDomain;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.TupleDomainSerde;

import static java.util.Objects.requireNonNull;

class JsonCodecTupleDomainSerde
implements TupleDomainSerde
{
private final JsonCodec<TupleDomain<ColumnHandle>> tupleDomainJsonCodec;

public JsonCodecTupleDomainSerde(JsonCodec<TupleDomain<ColumnHandle>> tupleDomainJsonCodec)
{
this.tupleDomainJsonCodec = requireNonNull(tupleDomainJsonCodec, "tupleDomainJsonCodec is null");
}

@Override
public String serialize(TupleDomain<ColumnHandle> tupleDomain)
{
return tupleDomainJsonCodec.toJson(tupleDomain);
}

@Override
public TupleDomain<ColumnHandle> deserialize(String serialized)
{
return tupleDomainJsonCodec.fromJson(serialized);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.facebook.presto.common.analyzer.PreparedQuery;
import com.facebook.presto.common.block.BlockEncodingManager;
import com.facebook.presto.common.block.SortOrder;
import com.facebook.presto.common.predicate.TupleDomain;
import com.facebook.presto.common.type.BooleanType;
import com.facebook.presto.common.type.Type;
import com.facebook.presto.connector.ConnectorCodecManager;
Expand Down Expand Up @@ -132,6 +133,7 @@
import com.facebook.presto.server.security.PasswordAuthenticatorManager;
import com.facebook.presto.server.security.PrestoAuthenticatorManager;
import com.facebook.presto.server.security.SecurityConfig;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.ConnectorId;
import com.facebook.presto.spi.NodeManager;
import com.facebook.presto.spi.PageIndexerFactory;
Expand Down Expand Up @@ -243,6 +245,7 @@
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.io.Closer;
import com.google.common.reflect.TypeToken;
import org.intellij.lang.annotations.Language;
import org.weakref.jmx.MBeanExporter;
import org.weakref.jmx.testing.TestingMBeanServer;
Expand Down Expand Up @@ -517,7 +520,8 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig,
new FilterStatsCalculator(metadata, scalarStatsCalculator, statsNormalizer),
blockEncodingManager,
featuresConfig,
new ConnectorCodecManager(ThriftCodecManager::new));
new ConnectorCodecManager(ThriftCodecManager::new),
jsonCodec(new TypeToken<TupleDomain<ColumnHandle>>() {}));

GlobalSystemConnectorFactory globalSystemConnectorFactory = new GlobalSystemConnectorFactory(ImmutableSet.of(
new NodeSystemTable(nodeManager),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.connector.informationSchema.InformationSchemaTableHandle;
import com.facebook.presto.connector.informationSchema.InformationSchemaTransactionHandle;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.spi.ConnectorId;
import com.facebook.presto.spi.ConnectorTableHandle;
import com.facebook.presto.spi.MaterializedViewDefinition;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.cost.StatsAndCosts;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.server.SliceDeserializer;
import com.facebook.presto.server.SliceSerializer;
import com.facebook.presto.spi.ConnectorId;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* 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.metadata;

import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.sql.analyzer.FeaturesConfig;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;

import static com.facebook.airlift.configuration.ConfigBinder.configBinder;

public class TestingHandleJsonModule
implements Module
{
@Override
public void configure(Binder binder)
{
binder.bind(ConnectorManager.class).toProvider(() -> null).in(Scopes.SINGLETON);
configBinder(binder).bindConfig(FeaturesConfig.class);

binder.install(new HandleJsonModule());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@
import com.facebook.presto.common.type.VarcharType;
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.Metadata;
import com.facebook.presto.metadata.MetadataManager;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.spi.WarningCollector;
import com.facebook.presto.spi.function.FunctionHandle;
import com.facebook.presto.spi.relation.ConstantExpression;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
import com.facebook.presto.common.type.TypeManager;
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.HandleResolver;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.spi.ConnectorId;
import com.facebook.presto.spi.SourceLocation;
import com.facebook.presto.spi.TableHandle;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import com.facebook.presto.common.type.TypeManager;
import com.facebook.presto.connector.ConnectorManager;
import com.facebook.presto.metadata.FunctionAndTypeManager;
import com.facebook.presto.metadata.HandleJsonModule;
import com.facebook.presto.metadata.TestingHandleJsonModule;
import com.facebook.presto.server.SliceDeserializer;
import com.facebook.presto.server.SliceSerializer;
import com.facebook.presto.spi.VariableAllocator;
Expand Down
Loading
Loading