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
- MERGE only into tables on connectors supporting merge (Iceberg, etc.).
- Rewrite the MERGE as insert-into plus delete/recreate logic supported by the connector.
- Upgrade Presto/connector to a version implementing createMergeSink for your catalog.
- 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
- Route MERGE statements only to Iceberg/Delta-class connectors.
- Check the connector's ConnectorPageSinkProvider implements createMergeSink.
- Test MERGE on each catalog in staging before promoting SQL.
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.