apache/beam · error · IllegalArgumentException

table must not be empty.

Error message

table must not be empty.

What it means

validate() requires a non-empty table option because Debezium's snapshot/stream config needs to know which tables to capture (table.include.list). An empty table string throws IllegalArgumentException.

Source

Thrown at sdks/java/io/debezium/src/main/java/org/apache/beam/io/debezium/DebeziumReadSchemaTransformProvider.java:235

    @SchemaFieldDescription(
        "Debezium connector type. Supported values: MYSQL, POSTGRES, SQLSERVER, ORACLE, and DB2.")
    public abstract @NonNull String getDatabase();

    @SchemaFieldDescription("Additional Debezium connection properties in key=value format.")
    public abstract @Nullable List<String> getDebeziumConnectionProperties();

    public void validate() {
      if (getHost().isEmpty()) {
        throw new IllegalArgumentException("host must not be empty.");
      }

      if (getPort() <= 0 || getPort() > 65535) {
        throw new IllegalArgumentException(
            "port must be between 1 and 65535, but was " + getPort() + ".");
      }

      if (getTable().isEmpty()) {
        throw new IllegalArgumentException("table must not be empty.");
      }

      List<String> connectionProperties = getDebeziumConnectionProperties();
      if (connectionProperties != null) {
        for (String property : connectionProperties) {
          if (property == null || property.indexOf('=') <= 0) {
            throw new IllegalArgumentException(
                "Invalid Debezium connection property '"
                    + property
                    + "'. Expected key=value format.");
          }
        }
      }
    }

    public static Builder builder() {
      return new AutoValue_DebeziumReadSchemaTransformProvider_DebeziumReadSchemaTransformConfiguration
          .Builder();

View on GitHub (pinned to 12126d8942)

Solutions

  1. Set the table option to a comma-separated list or regex of tables (e.g. "inventory.orders" or "db1.table1,db1.table2").
  2. Verify templated pipeline specs inject the table parameter correctly.
  3. Add a pre-flight check that all required fields (host, port, table) are non-empty.
  4. Use fully-qualified names (database.table) matching the Debezium include list format.

Example fix

// before
.withHost("db").withPort(3306).withUsername("u").withPassword("p") // no table
// after
.withHost("db").withPort(3306).withTable("inventory.orders").withUsername("u").withPassword("p")
Defensive patterns

Strategy: validation

Validate before calling

if (table == null || table.isBlank()) throw new IllegalArgumentException("table must be set (format: database.table or comma-separated list)");

Type guard

static boolean hasTable(DebeziumReadConfiguration c) {
  return c.getTable() != null && !c.getTable().isEmpty();
}

Prevention

When it happens

Trigger: Constructing the Debezium read transform without setting table, or setting it to ""; validate() runs during from().

Common situations: Missing table key in YAML/SQL pipeline configs, empty env substitution, or misunderstanding that 'database' alone is insufficient — a table list/pattern is required.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/000486b90b458ecb. Report an issue: GitHub.