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;
        }

        @Override

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Upgrade all nodes to a version that supports the merge paradigm in use
  2. Use a MERGE form supported by your Presto version
  3. 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

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.