apache/seatunnel · error · CatalogException
Failed EXECUTE SQL in catalog %s
Error message
Failed EXECUTE SQL in catalog %s
What it means
ClickhouseCatalog.executeSql runs an arbitrary SQL statement against the ClickHouse server through the proxy client. Any failure is wrapped in a CatalogException formatted as 'Failed EXECUTE SQL in catalog <sql>'. Note the message embeds the SQL text, so the failing statement is directly visible in the exception.
Source
Thrown at seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/catalog/ClickhouseCatalog.java:178
@Override
public void truncateTable(TablePath tablePath, boolean ignoreIfNotExists)
throws TableNotExistException, CatalogException {
try {
if (tableExists(tablePath)) {
proxy.truncateTable(tablePath, ignoreIfNotExists);
}
} catch (Exception e) {
throw new CatalogException("Truncate table failed", e);
}
}
@Override
public void executeSql(TablePath tablePath, String sql) {
try {
proxy.executeSql(sql);
} catch (Exception e) {
throw new CatalogException(String.format("Failed EXECUTE SQL in catalog %s", sql), e);
}
}
@Override
public boolean isExistsData(TablePath tablePath) {
try {
return proxy.isExistsData(tablePath.getFullName());
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
@Override
public void createDatabase(TablePath tablePath, boolean ignoreIfExists)
throws DatabaseAlreadyExistException, CatalogException {
proxy.createDatabase(tablePath.getDatabaseName(), ignoreIfExists);
}
View on GitHub (pinned to cf67b549a7)
Solutions
- Read the embedded SQL in the message and the 'Caused by' ClickHouse error to fix the statement syntax/dialect
- Validate the SQL against ClickHouse syntax (e.g. run it in clickhouse-client) before invoking the catalog
- Grant the user the privileges required by the statement, or run as a user with sufficient rights
- Confirm server connectivity and retry transient network failures
Example fix
// before catalog.executeSql(tablePath, "ALTER TABLE db.t MODIFY COLUMN c1 INT"); // after catalog.executeSql(tablePath, "ALTER TABLE db.t MODIFY COLUMN c1 Int32"); // ClickHouse dialect
Defensive patterns
Strategy: try-catch
Validate before calling
// dry-run the statement first catalog.executeSql(tablePath, "EXPLAIN " + sql); // throws CatalogException with the SQL text if invalid
Try / catch
try {
catalog.executeSql(tablePath, sql);
} catch (CatalogException e) {
// e.getMessage() already embeds the failing SQL
logger.error("executeSql failed [{}]: {}", sql, e.getCause() != null ? e.getCause().getMessage() : e.getMessage());
throw e;
} Prevention
- Write ClickHouse-dialect SQL (Int32/String, no MySQL-only clauses) and test it in clickhouse-client first
- Dry-run with EXPLAIN when the driver supports it
- Grant users the privileges the DDL requires
- Keep statements idempotent (IF EXISTS / IF NOT EXISTS) so safe retries are possible
When it happens
Trigger: Calling executeSql(tablePath, sql) when the SQL is syntactically invalid for ClickHouse, references missing objects, or the user lacks permission; also on connection/timeout failures of the underlying proxy request.
Common situations: DDL typed for MySQL/Postgres dialect that ClickHouse rejects; executing ALTER/DROP on tables the user cannot modify; SQL containing unquoted keywords or unsupported functions; server unreachable during DDL.
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
- Truncate table failed
- Unsupported action type:
- create table error
- Preview action is not supported
- Failed getting table %s
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/8072ef2684687fa7.
Report an issue: GitHub.