prestodb/presto · error · UnsupportedOperationException

This connector does not support row-level delete

Error message

This connector does not support row-level delete

What it means

UpdatablePageSource declares default methods for row-level DELETE; the default implementation throws UnsupportedOperationException("This connector does not support row-level delete"). Connectors that cannot delete rows inherit this default and fail at runtime when the engine issues DELETE against their table.

Source

Thrown at presto-spi/src/main/java/com/facebook/presto/spi/UpdatablePageSource.java:29

 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.facebook.presto.spi;

import com.facebook.presto.common.Page;
import com.facebook.presto.common.block.Block;
import io.airlift.slice.Slice;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public interface UpdatablePageSource
        extends ConnectorPageSource
{
    default void deleteRows(Block rowIds)
    {
        throw new UnsupportedOperationException("This connector does not support row-level delete");
    }

    default void updateRows(Page page, List<Integer> columnValueAndRowIdChannels)
    {
        throw new UnsupportedOperationException("This connector does not support row update");
    }

    CompletableFuture<Collection<Slice>> finish();

    default void abort() {}
}

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Remove the DELETE statement or restrict it to tables on connectors that support row deletes
  2. Implement deleteRows in your custom connector's UpdatablePageSource and declare update/delete capabilities in metadata (ConnectorMetadata.deleteTable/applyDelete)
  3. Filter DELETE statements in the query layer before they reach the unsupported connector

Example fix

// before
class MyPageSource implements UpdatablePageSource { /* deleteRows not overridden */ }
// after
@Override
public void deleteRows(Block rowIds) {
    myStore.deleteRows(rowIds);
}
Defensive patterns

Strategy: try-catch

Try / catch

try { pageSource.deleteRows(rowIds); } catch (UnsupportedOperationException e) { /* connector lacks row-level delete; fall back to full-table rewrite or fail gracefully */ }

Prevention

When it happens

Trigger: Executing DELETE FROM <table> [WHERE ...] against a connector whose ConnectorPageSourceFactory produces a page source that does not override deleteRows (and whose connector advertises or is assumed to support updates).

Common situations: Running DELETE on a connector without row-level delete support (e.g. base JDBC connector variant or custom connector); connector metadata reports supportsReportingWrittenBytes-style update capability but the page source wasn't implemented; upgrading a connector and relying on capabilities not implemented.

Related errors


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