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
- Set the table option to a comma-separated list or regex of tables (e.g. "inventory.orders" or "db1.table1,db1.table2").
- Verify templated pipeline specs inject the table parameter correctly.
- Add a pre-flight check that all required fields (host, port, table) are non-empty.
- 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
- Always specify tables using fully-qualified database.table names.
- Verify templated pipeline specs inject the table parameter.
- List required fields (host, port, table) in a startup config check.
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
- host must not be empty.
- port must be between 1 and 65535, but was .
- Invalid Debezium connection property ''. Expected key=value
- Unable to resolve class %s to use as Debezium connector.
- Cannot create enum from value!
AI-assisted analysis of apache/beam@12126d8942 (2026-09-13).
Data as JSON: /api/errors/000486b90b458ecb.
Report an issue: GitHub.