{"record":{"id":"cc2160d0d339bf7d","repo":"risingwavelabs/risingwave","slug":"intermediate-table-name-is-required-for-append-onl","errorCode":null,"errorMessage":"intermediate.table.name is required for append-only sink","messagePattern":"intermediate\\.table\\.name is required for append-only sink","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/snowflake_redshift/redshift.rs","lineNumber":221,"sourceCode":"\n    const SINK_NAME: &'static str = REDSHIFT_SINK;\n\n    crate::impl_validate_sink_unknown_fields!();\n\n    async fn validate(&self) -> Result<()> {\n        if self.config.create_table_if_not_exists {\n            let client = self.config.build_client()?;\n            let schema = self.param.schema();\n            let build_table_sql = build_create_table_sql(\n                self.config.schema.as_deref(),\n                &self.config.table,\n                &schema,\n                false,\n            )?;\n            client.execute_sql_sync(vec![build_table_sql]).await?;\n            if !self.is_append_only {\n                let cdc_table = self.config.cdc_table.as_ref().ok_or_else(|| {\n                    SinkError::Config(anyhow!(\n                        \"intermediate.table.name is required for append-only sink\"\n                    ))\n                })?;\n                let cdc_schema_for_create = self\n                    .config\n                    .intermediate_schema\n                    .as_deref()\n                    .or(self.config.schema.as_deref());\n                let build_cdc_table_sql =\n                    build_create_table_sql(cdc_schema_for_create, cdc_table, &schema, true)?;\n                client.execute_sql_sync(vec![build_cdc_table_sql]).await?;\n            }\n        }\n        Ok(())\n    }\n\n    fn support_schema_change() -> bool {\n        true","sourceCodeStart":203,"sourceCodeEnd":239,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/redshift.rs#L203-L239","documentation":"In the Redshift sink's `validate`, a non-append-only (upsert/Debezium) sink must specify an intermediate CDC table (`cdc_table`, i.e. `intermediate.table.name`) used to stage changes. If the config lacks `cdc_table` while `is_append_only` is false, this SinkError::Config is returned.","triggerScenarios":"Creating a Redshift sink with data that contains updates/deletes (not append-only) without setting the `intermediate.table.name` property.","commonSituations":"Users creating an upsert sink from a source with primary keys but forgetting the intermediate table setting; migrating configs where the property was renamed.","solutions":["Add `intermediate.table.name = '<cdc_table>'` to the sink properties","Create/use the intermediate staging table in Redshift that matches the sink schema","If the sink truly only inserts data, ensure it is declared append-only so cdc_table isn't required"],"exampleFix":"// before\nWITH ( connector = 'redshift', ... )\n-- after\nWITH ( connector = 'redshift', ..., 'intermediate.table.name' = 'rw_cdc_table' )","handlingStrategy":"validation","validationCode":"// before creating a non-append-only redshift sink\nif !is_append_only && !props.contains_key(\"intermediate.table.name\") {\n    return Err(\"intermediate.table.name is required for non-append-only redshift sink\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remember: any sink with a primary key is non-append-only and needs the intermediate table","Create the staging table in Redshift ahead of time","Document required properties per sink type for your team"],"tags":["rust","risingwave","sink","redshift","config"],"backgroundTag":"missing-required-config-field","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}