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

  1. Set the 'table' option explicitly in the sink config to the intended Databend table
  2. Verify the CatalogTable's TableId table name matches your intended target if you intend to rely on the fallback
  3. 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

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


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