risingwavelabs/risingwave · error

Invalid properties for iceberg source

Error message

Invalid properties for iceberg source: {:?}

What it means

`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.

Solutions

  1. Compare the printed props against the Iceberg source docs and add the missing required keys (`catalog.type`, `warehouse`, table identifiers).
  2. Fix typos/casing in WITH option names.
  3. Provide catalog credentials/storage options (e.g. s3.access_key, s3.secret_key, endpoint) if using S3-based catalogs.
  4. Test the same catalog config with a standalone Iceberg/Spark client to verify property validity.

Example fix

// before
CREATE SOURCE s WITH (connector='iceberg', wh='s3://bucket/wh');
// after
CREATE SOURCE s WITH (connector='iceberg', catalog.type='rest', warehouse='s3://bucket/wh', catalog.uri='https://rest:8181');
Defensive patterns

Strategy: validation

Validate before calling

// validate iceberg source properties before CREATE SOURCE
function validateIcebergProps(p) {
  const required = ['catalog.type', 'warehouse'];
  const missing = required.filter(k => !(k in p));
  if (missing.length) throw new Error('missing iceberg props: ' + missing.join(','));
}

Prevention

When it happens

Trigger: `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.

Common situations: 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.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/5e8ba330292951a4. Report an issue: GitHub.

Appendix: source

Thrown at src/frontend/src/handler/create_source/external_schema/iceberg.rs:60

                                field.name()
                            )
                        })?,
                );
                Ok(ColumnCatalog {
                    column_desc,
                    // hide the _row_id column for iceberg engine table
                    // This column is auto generated when users define a table without primary key
                    is_hidden: field.name() == ROW_ID_COLUMN_NAME,
                })
            })
            .collect::<anyhow::Result<Vec<_>>>()?;
        columns.extend(ColumnCatalog::iceberg_hidden_cols());

        tracing::info!("iceberg columns: {:?}", columns);

        Ok(columns)
    } else {
        Err(anyhow!(format!(
            "Invalid properties for iceberg source: {:?}",
            props
        )))
    }
}

View on GitHub (pinned to 6469eb736d)