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.

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)

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.