risingwavelabs/risingwave · error · SinkError::Config
`intermediate.table.name`, `write.target.interval.seconds`…
Error message
`intermediate.table.name`, `write.target.interval.seconds`, `warehouse`, `task.serverless`, and `task.target_completion_interval` require `{}` = {} What it means
from_btreemap enforces that the Snowflake upsert-task options (`intermediate.table.name`, `write.target.interval.seconds`, `warehouse`, `task.serverless`, `task.target_completion_interval`) only apply to upsert-type sinks. If any of these is set on a non-upsert (append-only) sink, configuration is rejected because those options control the CDC COPY INTO task that only upsert sinks run.
Solutions
- Change the sink to `type = 'upsert'` (with `with_s3 = true`) if you need CDC semantics
- Remove the upsert-task options (`warehouse`, `task.serverless`, etc.) from the append-only sink
- Split into two sinks: an append-only one without task options and an upsert one with them
Example fix
// before WITH (connector='snowflake', type='append-only', warehouse='WH'); // after WITH (connector='snowflake', type='append-only'); // or WITH (connector='snowflake', type='upsert', with_s3=true, warehouse='WH');
Defensive patterns
Strategy: validation
Validate before calling
let task_opts = ["intermediate.table.name","write.target.interval.seconds","warehouse","task.serverless","task.target_completion_interval"];
if sink_type != "upsert" && task_opts.iter().any(|o| options.contains_key(*o)) {
return Err("task options require type = 'upsert'");
} Prevention
- Only add task-tuning options to upsert-type Snowflake sinks
- When changing sink type, audit all WITH options for leftovers
- Name templates by sink type to avoid option mixing
When it happens
Trigger: Creating an append-only Snowflake sink while setting any of: snowflake_cdc_table_name / intermediate table, `write.target.interval.seconds`, `warehouse`, `task.serverless`, or `task.target_completion_interval` in the WITH options.
Common situations: Adding task-tuning options copied from an upsert sink example onto an append-only sink; switching `type` back to append-only but leaving upsert-task options behind.
Understand the failure class
Background: Conflicting config options: "cannot be used together" — configuration validation errors across open-source libraries — this error's family across 162 libraries.
Related errors
- Snowflake upsert sinks require `with_s3 = true` so all CDC…
- `task.serverless` must not be combined with `warehouse`
- `task.target_completion_interval` requires…
- auth.method=key_pair_file must not set `password`
- auth.method=key_pair_file must not set `private_key_pem`
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/ac3e2641d9ce450c.
Report an issue: GitHub.
Appendix: source
Thrown at src/connector/src/sink/snowflake_redshift/snowflake.rs:253
return Err(SinkError::Config(anyhow!(
"`{}` must be {}, or {}",
SINK_TYPE_OPTION,
SINK_TYPE_APPEND_ONLY,
SINK_TYPE_UPSERT
)));
}
if config.r#type == SINK_TYPE_UPSERT && !config.with_s3 {
return Err(SinkError::Config(anyhow!(
"Snowflake upsert sinks require `with_s3 = true` so all CDC rows are loaded by the serialized COPY INTO task"
)));
}
let has_upsert_task_config = config.snowflake_cdc_table_name.is_some()
|| properties.contains_key("write.target.interval.seconds")
|| config.snowflake_warehouse.is_some()
|| config.task_serverless
|| config.task_target_completion_interval.is_some();
if config.r#type != SINK_TYPE_UPSERT && has_upsert_task_config {
return Err(SinkError::Config(anyhow!(
"`intermediate.table.name`, `write.target.interval.seconds`, `warehouse`, \
`task.serverless`, and `task.target_completion_interval` require `{}` = {}",
SINK_TYPE_OPTION,
SINK_TYPE_UPSERT
)));
}
if config.task_target_completion_interval.is_some() && !config.task_serverless {
return Err(SinkError::Config(anyhow!(
"`task.target_completion_interval` requires `task.serverless` to be true"
)));
}
if config.task_serverless && config.snowflake_warehouse.is_some() {
return Err(SinkError::Config(anyhow!(
"`task.serverless` must not be combined with `warehouse`"
)));
}
// Normalize and validate authentication methodView on GitHub (pinned to 6469eb736d)