prestodb/presto · error · PrestoException
NOT_SUPPORTED
NOT_SUPPORTED
Error message
Merge paradigm not supported:
What it means
MergeProcessorOperator.createRowChangeProcessor switches on the MergeSourceHandle's paradigm (e.g. CHANGE_ONLY_UPDATED_COLUMNS) to build the row change processor. If the paradigm has no case, Presto throws NOT_SUPPORTED, meaning the plan requested a merge paradigm this operator version cannot execute.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/operator/MergeProcessorOperator.java:88
int rowIdChannel,
int mergeRowChannel,
List<Integer> targetColumnChannels)
{
switch (merge.getParadigm()) {
case DELETE_ROW_AND_INSERT_ROW:
return new DeleteAndInsertMergeProcessor(
merge.getColumnTypes(),
merge.getTargetTableRowIdColumnType(),
rowIdChannel,
mergeRowChannel,
targetColumnChannels);
case CHANGE_ONLY_UPDATED_COLUMNS:
return new ChangeOnlyUpdatedColumnsMergeProcessor(
rowIdChannel,
mergeRowChannel,
targetColumnChannels);
default:
throw new PrestoException(NOT_SUPPORTED, "Merge paradigm not supported: " + merge.getParadigm());
}
}
@Override
public Operator createOperator(DriverContext driverContext)
{
checkState(!closed, "Factory is already closed");
OperatorContext context = driverContext.addOperatorContext(operatorId, planNodeId, MergeProcessorOperator.class.getSimpleName());
return new MergeProcessorOperator(context, rowChangeProcessor);
}
@Override
public void noMoreOperators()
{
closed = true;
}
@OverrideView on GitHub (pinned to 55bb57d202)
Solutions
- Upgrade all nodes to a version that supports the merge paradigm in use
- Use a MERGE form supported by your Presto version
- If you are a connector author, implement the missing paradigm case in MergeProcessorOperator.createRowChangeProcessor
Example fix
// before case CHANGE_ONLY_UPDATED_COLUMNS: ... default: throw new PrestoException(NOT_SUPPORTED, "Merge paradigm not supported: " + merge.getParadigm()); // after case CHANGE_ONLY_UPDATED_COLUMNS: ... case FULL_ROW_UPDATE: return new FullRowUpdateMergeProcessor(...); default: throw ...
Defensive patterns
Strategy: try-catch
Validate before calling
// ensure client and server versions support the merge paradigm used // check coordinator: SELECT * FROM runtime.nodes; -- all nodes same version
Try / catch
try { execute(mergeSql); } catch (PrestoException e) {
if (e.getErrorCode().getName().equals("NOT_SUPPORTED") && e.getMessage().startsWith("Merge paradigm not supported")) {
throw new IllegalStateException("Upgrade Presto or use a supported MERGE form: " + e.getMessage());
} throw e;
} Prevention
- Keep coordinator and workers on identical versions
- Check release notes for supported MERGE paradigms before using new MERGE syntax
- Connector authors: add the paradigm case to createRowChangeProcessor in the same change that introduces it
When it happens
Trigger: A MERGE statement (or connector-provided merge handle) produces a paradigm value not covered by the switch in createRowChangeProcessor.
Common situations: Running a query planned by a newer coordinator/connector against workers with an older operator implementation, or connector authors introducing a custom paradigm without operator support.
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/8b1af4f7316c1c35.
Report an issue: GitHub.