apache/seatunnel · warning
Table name not specified in options, using table name from c
Error message
Table name not specified in options, using table name from catalog: {} What it means
DatabendSink's constructor resolves the target table from options. When the 'table' option is absent or empty, the sink falls back to the table name from the catalog's CatalogTable (TableId) and logs this warning. The sink works, but the table comes from an implicit source — a common source of writing to an unexpected table if catalog metadata differs from intent.
Source
Thrown at seatunnel-connectors-v2/connector-databend/src/main/java/org/apache/seatunnel/connectors/seatunnel/databend/sink/DatabendSink.java:93
private final DatabendSinkConfig databendSinkConfig;
private ReadonlyConfig readonlyConfig;
// CDC infrastructure initialization fields
private boolean isCdcInfrastructureInitialized = false;
private JobContext jobContext;
public DatabendSink(CatalogTable catalogTable, ReadonlyConfig options) {
this.catalogTable = catalogTable;
this.databendSinkConfig = DatabendSinkConfig.of(options);
this.schemaSaveMode = options.get(DatabendSinkOptions.SCHEMA_SAVE_MODE);
this.dataSaveMode = options.get(DatabendSinkOptions.DATA_SAVE_MODE);
this.customSql = options.getOptional(DatabendSinkOptions.CUSTOM_SQL).orElse(null);
this.database =
options.getOptional(DatabendOptions.DATABASE)
.orElse(catalogTable.getTableId().getDatabaseName());
String configuredTable = options.get(DatabendOptions.TABLE);
if (configuredTable == null || configuredTable.isEmpty()) {
log.warn(
"Table name not specified in options, using table name from catalog: {}",
catalogTable.getTableId().getTableName());
this.table = catalogTable.getTableId().getTableName();
} else {
this.table = configuredTable;
}
this.rawTableName = databendSinkConfig.getRawTableName();
this.streamName = databendSinkConfig.getStreamName();
this.autoCommit = options.get(DatabendOptions.AUTO_COMMIT);
this.batchSize = options.get(DatabendOptions.BATCH_SIZE);
this.executeTimeoutSec = options.get(DatabendSinkOptions.EXECUTE_TIMEOUT_SEC);
this.readonlyConfig = options;
// detail schema log
log.info("DatabendSink initialized with catalog table: {}", catalogTable);
log.info("Catalog table ID: {}", catalogTable.getTableId());
log.info("Catalog table schema: {}", catalogTable.getTableSchema());
log.info("Catalog table row type: {}", catalogTable.getSeaTunnelRowType());View on GitHub (pinned to cf67b549a7)
Solutions
- Set the 'table' option explicitly in the sink config to the intended Databend table
- Verify the CatalogTable's TableId table name matches your intended target if you intend to rely on the fallback
- For multi-table sync, confirm per-table routing/mapping is configured as expected
Example fix
// before database = "analytics" // no table set // after database = "analytics" table = "events" # explicit target table
Defensive patterns
Strategy: validation
Validate before calling
// Validate sink config before job submission
String table = config.getOptional("table");
if (table == null || table.isEmpty()) {
log.warn("'table' not set; falling back to catalog table name: {}",
catalogTable.getTableId().getTableName());
} Prevention
- Always set the table option explicitly for single-table sinks
- When relying on the catalog fallback, verify TableId names match the target
- Include table in your config templates and CI validation
When it happens
Trigger: Creating a DatabendSink with a ReadonlyConfig that lacks the DatabendOptions.TABLE key (or has an empty string), while CatalogTable has a table name.
Common situations: Configs built programmatically or from schemas where only database was set; multi-table/whole-database synchronization jobs relying on catalog table ids; copy-pasted config templates missing the table key.
Understand the failure class
Background: "missing required config value" errors: why libraries refuse to start when a configuration key is empty, unset, or blank — this error's family across 48 libraries.
Related errors
- Could not query table schema, using inferred schema from dat
- Option 'field_delimiter' cannot be empty
- Option 'max_in_flight' must be greater than zero
- Option 'operation_timeout_ms' must be greater than zero
- CONNECT_FAILED
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/46e91fa3c4cbc0a7.
Report an issue: GitHub.