apache/seatunnel · error · org.apache.seatunnel.api.table.catalog.exception.CatalogException

truncate table error

Error message

truncate table error

What it means

MaxComputeCatalog.truncateTable either deletes+recreates a partition or calls odpsTable.truncate(); any Exception is wrapped in a CatalogException with this message. Truncation failed at the SDK level (missing table, bad partition spec, permissions, or transient errors).

Solutions

  1. Check the cause exception for which SDK call failed
  2. Verify the partition spec column names/values exactly match the table's partition schema
  3. Confirm the table exists and the account has Alter/Write permissions
  4. Manually test the equivalent truncate/delete-partition via odpscmd

Example fix

// before
PartitionSpec spec = new PartitionSpec("ds='2024-01-01'");
catalog.truncateTable(TablePath.of("proj", "events"), spec); // table partitioned by ds,pt
// after
PartitionSpec spec = new PartitionSpec("ds='2024-01-01', pt='00'"); // full partition key
catalog.truncateTable(TablePath.of("proj", "events"), spec);
Defensive patterns

Strategy: validation

Validate before calling

// verify partition spec matches the table's partition columns before truncating
Table odpsTable = odps.tables().get(tableName);
if (odpsTable.getPartitionColumnInfo().stream()
        .noneMatch(c -> partitionSpec.keys().contains(c.getName()))) {
    throw new IllegalArgumentException("PartitionSpec " + partitionSpec + " does not match table partition columns");
}

Try / catch

try {
    catalog.truncateTable(tablePath, partitionSpec);
} catch (CatalogException e) {
    LOG.error("Truncate failed for " + tablePath + ", spec=" + partitionSpec, e);
    throw e;
}

Prevention

When it happens

Trigger: truncateTable resolves the odps table; for partitioned tables it calls deletePartition/createPartition with a PartitionSpec; otherwise odpsTable.truncate(). Any of these throws and is rethrown as 'truncate table error'.

Common situations: PartitionSpec does not match the table's partition columns; table not found (name/database mismatch); account lacks Alter permission on the table; truncate called on a table type that doesn't support it.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/cc93f990271194dd. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-maxcompute/src/main/java/org/apache/seatunnel/connectors/seatunnel/maxcompute/catalog/MaxComputeCatalog.java:258

    @Override
    public void truncateTable(TablePath tablePath, boolean ignoreIfNotExists)
            throws TableNotExistException, CatalogException {
        try {
            Odps odps = getOdps(tablePath.getDatabaseName(), tablePath.getSchemaName());
            Table odpsTable = odps.tables().get(tablePath.getTableName());
            if (odpsTable.isPartitioned()
                    && StringUtils.isNotEmpty(
                            readonlyConfig.get(MaxcomputeBaseOptions.PARTITION_SPEC))) {
                PartitionSpec partitionSpec =
                        new PartitionSpec(readonlyConfig.get(MaxcomputeBaseOptions.PARTITION_SPEC));
                odpsTable.deletePartition(partitionSpec, ignoreIfNotExists);
                odpsTable.createPartition(partitionSpec, true);
            } else {
                odpsTable.truncate();
            }
        } catch (Exception e) {
            throw new CatalogException("truncate table error", e);
        }
    }

    public void createPartition(TablePath tablePath, PartitionSpec partitionSpec) {
        try {
            Odps odps = getOdps(tablePath.getDatabaseName(), tablePath.getSchemaName());
            Table odpsTable = odps.tables().get(tablePath.getTableName());
            odpsTable.createPartition(partitionSpec, true);
        } catch (Exception e) {
            throw new CatalogException("create partition error", e);
        }
    }

    public void truncatePartition(TablePath tablePath, PartitionSpec partitionSpec) {
        try {
            Odps odps = getOdps(tablePath.getDatabaseName(), tablePath.getSchemaName());
            Table odpsTable = odps.tables().get(tablePath.getTableName());
            odpsTable.deletePartition(partitionSpec, true);

View on GitHub (pinned to cf67b549a7)