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

execute sql error

Error message

execute sql error

What it means

MaxComputeCatalog.executeSql runs each statement of a multi-statement SQL script through SQLTask.run(...).waitForSuccess(). Any OdpsException from submission or execution is rethrown as CatalogException('execute sql error'). The underlying OdpsException carries the actual ODPS error code.

Source

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

    public boolean isExistsData(TablePath tablePath) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void executeSql(TablePath tablePath, String sql) {
        try {
            Odps odps = getOdps(tablePath.getDatabaseName(), tablePath.getSchemaName());
            String[] sqls = sql.split(";");
            for (String s : sqls) {
                if (!s.trim().isEmpty()) {
                    if (!s.trim().endsWith(";")) {
                        s = s.trim() + ";";
                    }
                    SQLTask.run(odps, s).waitForSuccess();
                }
            }
        } catch (OdpsException e) {
            throw new CatalogException("execute sql error", e);
        }
    }

    @Override
    public PreviewResult previewAction(
            ActionType actionType, TablePath tablePath, Optional<CatalogTable> catalogTable) {
        if (actionType == ActionType.CREATE_TABLE) {
            checkArgument(catalogTable.isPresent(), "CatalogTable cannot be null");
            return new SQLPreviewResult(
                    MaxComputeCatalogUtil.getCreateTableStatement(
                            readonlyConfig.get(MaxcomputeSinkOptions.SAVE_MODE_CREATE_TEMPLATE),
                            tablePath,
                            catalogTable.get()));
        } else if (actionType == ActionType.DROP_TABLE) {
            return new SQLPreviewResult(MaxComputeCatalogUtil.getDropTableQuery(tablePath, true));
        } else {
            throw new UnsupportedOperationException("Unsupported action type: " + actionType);
        }

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Read the chained OdpsException (getCode/getMessage) for the exact ODPS error
  2. Run the failing statement manually in MaxCompute Studio/odpscmd to reproduce and fix syntax
  3. Add IF EXISTS/IF NOT EXISTS guards to DDL or fix the custom template
  4. Verify endpoint, project name and credentials in the MaxCompute configuration
Defensive patterns

Strategy: try-catch

Validate before calling

for (String s : sql.split(";")) {
    if (s.isBlank()) continue;
    // dry-run/preview via catalog.previewAction when action type is CREATE_TABLE/DROP_TABLE
}

Try / catch

try { catalog.executeSql(tablePath, sql); }
catch (CatalogException e) {
    OdpsException oe = (OdpsException) e.getCause();
    LOG.error("ODPS task failed code={} msg={}", oe.getCode(), oe.getMessage(), oe);
    throw e;
}

Prevention

When it happens

Trigger: Executing save-mode SQL actions (create/drop table, truncate, etc.) where the SQL is invalid, references a missing table/project, or the ODPS task fails at runtime (quota, permission, syntax).

Common situations: Custom save_mode create template with MaxCompute-incompatible DDL; dropping a non-existent table without IF EXISTS; running SQL against the wrong project/endpoint; account lacks permission for the statement.

Understand the failure class

Background: "query failed", "%w: SQL error" — wrapped database query errors in Go libraries explained — this error's family across 3 libraries.

Related errors


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