{"record":{"id":"c58e6039625ce80a","repo":"prestodb/presto","slug":"not-supported-c58e60","errorCode":"NOT_SUPPORTED","errorMessage":"This connector does not support SQL MERGE operations","messagePattern":"This connector does not support SQL MERGE operations","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"error","filePath":"presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java","lineNumber":42,"sourceCode":"import com.facebook.presto.spi.PageSinkContext;\nimport com.facebook.presto.spi.PrestoException;\n\nimport static com.facebook.presto.spi.StandardErrorCode.NOT_SUPPORTED;\n\npublic interface ConnectorPageSinkProvider\n{\n    ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorOutputTableHandle outputTableHandle, PageSinkContext pageSinkContext);\n\n    ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorInsertTableHandle insertTableHandle, PageSinkContext pageSinkContext);\n\n    default ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDeleteTableHandle deleteTableHandle, PageSinkContext pageSinkContext)\n    {\n        throw new UnsupportedOperationException(\"ConnectorPageSinkProvider does not support connectorDeleteTableHandle\");\n    }\n\n    default ConnectorMergeSink createMergeSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorMergeTableHandle mergeHandle)\n    {\n        throw new PrestoException(NOT_SUPPORTED, \"This connector does not support SQL MERGE operations\");\n    }\n\n    default ConnectorPageSink createPageSink(ConnectorTransactionHandle transactionHandle, ConnectorSession session, ConnectorDistributedProcedureHandle procedureHandle, PageSinkContext pageSinkContext)\n    {\n        throw new PrestoException(NOT_SUPPORTED, \"This connector does not support distributed procedure\");\n    }\n}\n","sourceCodeStart":24,"sourceCodeEnd":50,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-spi/src/main/java/com/facebook/presto/spi/connector/ConnectorPageSinkProvider.java#L24-L50","documentation":"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.","triggerScenarios":"Running `MERGE INTO <table> ...` (and UPDATE/DELETE that use the merge sink path) on a table whose connector's ConnectorPageSinkProvider does not override createMergeSink.","commonSituations":"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.","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."],"exampleFix":"// before\nMERGE INTO hive.target t USING src s ON t.id = s.id WHEN MATCHED THEN UPDATE SET v = s.v;\n\n// after\nDELETE FROM hive.target WHERE id IN (SELECT id FROM src);\nINSERT INTO hive.target SELECT * FROM src;","handlingStrategy":"validation","validationCode":"if (!mergeCapableCatalogs.contains(catalog)) {\n    throw new IllegalStateException(\"MERGE requires merge-capable catalog, got: \" + catalog);\n}","typeGuard":null,"tryCatchPattern":"try {\n    executeMerge(...);\n} catch (PrestoException e) {\n    if (e.getErrorCode() == NOT_SUPPORTED.toErrorCode()) {\n        rewriteAsDeleteAndInsert();\n    } else throw e;\n}","preventionTips":["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."],"tags":["presto","spi","connector","not-supported","merge"],"backgroundTag":"connector-feature-not-supported","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}