{"record":{"id":"ac3e2641d9ce450c","repo":"risingwavelabs/risingwave","slug":"intermediate-table-name-write-target-interval","errorCode":null,"errorMessage":"`intermediate.table.name`, `write.target.interval.seconds`, `warehouse`, `task.serverless`, and `task.target_completion_interval` require `{}` = {}","messagePattern":"`intermediate\\.table\\.name`, `write\\.target\\.interval\\.seconds`, `warehouse`, `task\\.serverless`, and `task\\.target_completion_interval` require `(.+?)` = (.+?)","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/snowflake_redshift/snowflake.rs","lineNumber":253,"sourceCode":"            return Err(SinkError::Config(anyhow!(\n                \"`{}` must be {}, or {}\",\n                SINK_TYPE_OPTION,\n                SINK_TYPE_APPEND_ONLY,\n                SINK_TYPE_UPSERT\n            )));\n        }\n        if config.r#type == SINK_TYPE_UPSERT && !config.with_s3 {\n            return Err(SinkError::Config(anyhow!(\n                \"Snowflake upsert sinks require `with_s3 = true` so all CDC rows are loaded by the serialized COPY INTO task\"\n            )));\n        }\n        let has_upsert_task_config = config.snowflake_cdc_table_name.is_some()\n            || properties.contains_key(\"write.target.interval.seconds\")\n            || config.snowflake_warehouse.is_some()\n            || config.task_serverless\n            || config.task_target_completion_interval.is_some();\n        if config.r#type != SINK_TYPE_UPSERT && has_upsert_task_config {\n            return Err(SinkError::Config(anyhow!(\n                \"`intermediate.table.name`, `write.target.interval.seconds`, `warehouse`, \\\n                 `task.serverless`, and `task.target_completion_interval` require `{}` = {}\",\n                SINK_TYPE_OPTION,\n                SINK_TYPE_UPSERT\n            )));\n        }\n        if config.task_target_completion_interval.is_some() && !config.task_serverless {\n            return Err(SinkError::Config(anyhow!(\n                \"`task.target_completion_interval` requires `task.serverless` to be true\"\n            )));\n        }\n        if config.task_serverless && config.snowflake_warehouse.is_some() {\n            return Err(SinkError::Config(anyhow!(\n                \"`task.serverless` must not be combined with `warehouse`\"\n            )));\n        }\n\n        // Normalize and validate authentication method","sourceCodeStart":235,"sourceCodeEnd":271,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/snowflake.rs#L235-L271","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nWITH (connector='snowflake', type='append-only', warehouse='WH');\n// after\nWITH (connector='snowflake', type='append-only');\n// or\nWITH (connector='snowflake', type='upsert', with_s3=true, warehouse='WH');","handlingStrategy":"validation","validationCode":"let task_opts = [\"intermediate.table.name\",\"write.target.interval.seconds\",\"warehouse\",\"task.serverless\",\"task.target_completion_interval\"];\nif sink_type != \"upsert\" && task_opts.iter().any(|o| options.contains_key(*o)) {\n    return Err(\"task options require type = 'upsert'\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["snowflake","sink","config-validation","risingwave"],"backgroundTag":"conflicting-config-options","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}