prestodb/presto · error · PrestoException

NOT_SUPPORTED

NOT_SUPPORTED

Error message

This connector does not support SQL MERGE operations

What it means

ConnectorPageSinkProvider.createMergeSink is a default SPI method returning the sink used to write row-level changes for SQL MERGE. The base implementation throws NOT_SUPPORTED because the connector lacks a ConnectorMergeSink, i.e. it cannot apply UPDATE/DELETE/MERGE row-level writes.

Source

Thrown at presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java:42

import com.facebook.presto.spi.PageSinkContext;
import com.facebook.presto.spi.PrestoException;

import static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED;

public interface ConnectorPageSinkProvider
{
    ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorOutputTableHandle outputTableHandle, PageSinkContext pageSinkContext);

    ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorInsertTableHandle insertTableHandle, PageSinkContext pageSinkContext);

    default ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDeleteTableHandle deleteTableHandle, PageSinkContext pageSinkContext)
    {
        throw new UnsupportedOperationException("ConnectorPageSinkProvider does not support connectorDeleteTableHandle");
    }

    default ConnectorMergeSink createMergeSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorMergeTableHandle mergeHandle)
    {
        throw new PrestoException(NOT_SUPPORTED, "This connector does not support SQL MERGE operations");
    }

    default ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDistributedProcedureHandle procedureHandle, PageSinkContext pageSinkContext)
    {
        throw new PrestoException(NOT_SUPPORTED, "This connector does not support distributed procedure");
    }
}

View on GitHub (pinned to 55bb57d202)

Solutions

  1. MERGE only into tables on connectors supporting merge (Iceberg, etc.).
  2. Rewrite the MERGE as insert-into plus delete/recreate logic supported by the connector.
  3. Upgrade Presto/connector to a version implementing createMergeSink for your catalog.
  4. If you own the connector, implement createMergeSink in its ConnectorPageSinkProvider.

Example fix

// before
MERGE INTO hive.target t USING src s ON t.id = s.id WHEN MATCHED THEN UPDATE SET v = s.v;

// after
DELETE FROM hive.target WHERE id IN (SELECT id FROM src);
INSERT INTO hive.target SELECT * FROM src;
Defensive patterns

Strategy: validation

Validate before calling

if (!mergeCapableCatalogs.contains(catalog)) {
    throw new IllegalStateException("MERGE requires merge-capable catalog, got: " + catalog);
}

Try / catch

try {
    executeMerge(...);
} catch (PrestoException e) {
    if (e.getErrorCode() == NOT_SUPPORTED.toErrorCode()) {
        rewriteAsDeleteAndInsert();
    } else throw e;
}

Prevention

When it happens

Trigger: Running `MERGE INTO <table> ...` (and UPDATE/DELETE that use the merge sink path) on a table whose connector's ConnectorPageSinkProvider does not override createMergeSink.

Common situations: Issuing MERGE against Hive or JDBC-backed tables that only support insert/delete-as-partition-drop; connector version before merge support was added; catalog not Iceberg/Delta-class.

Understand the failure class

Background: Presto NOT_SUPPORTED error: what "not supported" means and how to fix it — this error's family across 3 libraries.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/c58e6039625ce80a. Report an issue: GitHub.