{"record":{"id":"5e8ba330292951a4","repo":"risingwavelabs/risingwave","slug":"invalid-properties-for-iceberg-source","errorCode":null,"errorMessage":"Invalid properties for iceberg source: {:?}","messagePattern":"Invalid properties for iceberg source: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/frontend/src/handler/create_source/external_schema/iceberg.rs","lineNumber":60,"sourceCode":"                                field.name()\n                            )\n                        })?,\n                );\n                Ok(ColumnCatalog {\n                    column_desc,\n                    // hide the _row_id column for iceberg engine table\n                    // This column is auto generated when users define a table without primary key\n                    is_hidden: field.name() == ROW_ID_COLUMN_NAME,\n                })\n            })\n            .collect::<anyhow::Result<Vec<_>>>()?;\n        columns.extend(ColumnCatalog::iceberg_hidden_cols());\n\n        tracing::info!(\"iceberg columns: {:?}\", columns);\n\n        Ok(columns)\n    } else {\n        Err(anyhow!(format!(\n            \"Invalid properties for iceberg source: {:?}\",\n            props\n        )))\n    }\n}\n","sourceCodeStart":42,"sourceCodeEnd":66,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/handler/create_source/external_schema/iceberg.rs#L42-L66","documentation":"`extract_iceberg_columns` returns an `anyhow!` error when a source's properties fail to deserialize into the expected Iceberg source property struct (catalog type, warehouse URI, database/table, etc.). The `else` branch fires when `props` cannot be interpreted as valid Iceberg catalog properties, so column binding from the remote Iceberg table is aborted.","triggerScenarios":"`CREATE SOURCE ... WITH (connector = 'iceberg', ...)` where required properties (e.g. `catalog.type`, `warehouse`, database/table names) are missing, misnamed, or of wrong type, so the `FromStr` conversion of props fails before `bind_columns_from_source_for_non_cdc` proceeds.","commonSituations":"Typos in WITH options; missing `warehouse` or catalog credentials (S3 path/keys) required by the catalog config; REST vs Hadoop/Hive catalog property shapes mixed up; version changes to accepted property names.","solutions":["Compare the printed props against the Iceberg source docs and add the missing required keys (`catalog.type`, `warehouse`, table identifiers).","Fix typos/casing in WITH option names.","Provide catalog credentials/storage options (e.g. s3.access_key, s3.secret_key, endpoint) if using S3-based catalogs.","Test the same catalog config with a standalone Iceberg/Spark client to verify property validity."],"exampleFix":"// before\nCREATE SOURCE s WITH (connector='iceberg', wh='s3://bucket/wh');\n// after\nCREATE SOURCE s WITH (connector='iceberg', catalog.type='rest', warehouse='s3://bucket/wh', catalog.uri='https://rest:8181');","handlingStrategy":"validation","validationCode":"// validate iceberg source properties before CREATE SOURCE\nfunction validateIcebergProps(p) {\n  const required = ['catalog.type', 'warehouse'];\n  const missing = required.filter(k => !(k in p));\n  if (missing.length) throw new Error('missing iceberg props: ' + missing.join(','));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep a canonical WITH-options template per catalog type (REST/Hive/Hadoop).","Include storage credentials (s3 keys/endpoint) whenever the warehouse is on object storage.","Re-test catalog options with a standalone Iceberg client after upgrading RisingWave."],"tags":["iceberg","source","properties","validation"],"backgroundTag":"invalid-config-value","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"}