risingwavelabs/risingwave · error · ErrorCode::NotSupported

non shared source has no fragments to describe

Error message

non shared source has no fragments to describe

What it means

`DESCRIBE FRAGMENTS` shows the streaming fragments of a shared source or streaming job. Non-shared (single-node) sources have no independently managed fragments, so the handler rejects the command and points users to plain `DESCRIBE`.

Solutions

  1. Use `DESCRIBE <source_name>` instead to inspect schema
  2. If fragment inspection is needed, recreate or configure the source as shared (`CREATE SHARED SOURCE ...` or enable shared source in config)
  3. Use `EXPLAIN` / `SHOW FRAGMENTS` on the relevant MV or job instead

Example fix

// before
DESCRIBE FRAGMENTS my_source;
// after
DESCRIBE my_source;
Defensive patterns

Strategy: validation

Validate before calling

-- shared sources can be listed; only run DESCRIBE FRAGMENTS on those
SELECT name FROM rw_catalog.rw_sources WHERE ...;

Try / catch

catch NotSupported with hint 'Use DESCRIBE instead of DESCRIBE FRAGMENTS' and fall back to DESCRIBE

Prevention

When it happens

Trigger: Running `DESCRIBE FRAGMENTS <source_name>` where `<source_name>` resolves to a source created without shared-source support (e.g. a non-shared Kafka source, or shared source disabled in config).

Common situations: Trying to inspect execution plans of a regular source; confusion between shared vs non-shared sources; older sources created before shared sources were enabled.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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

Appendix: source

Thrown at src/frontend/src/handler/describe.rs:290

pub async fn handle_describe_fragments(
    handler_args: HandlerArgs,
    object_name: ObjectName,
) -> Result<RwPgResponse> {
    let session = handler_args.session.clone();
    let job_id = {
        let mut binder = Binder::new_for_system(&session);

        Binder::validate_cross_db_reference(&session.database(), &object_name)?;
        let not_found_err = CatalogError::not_found("stream job", object_name.to_string());

        if let Ok(relation) = binder.bind_catalog_relation_by_object_name(&object_name, true) {
            match relation {
                Relation::Source(s) => {
                    if s.is_shared() {
                        s.catalog.id.as_share_source_job_id()
                    } else {
                        bail!(ErrorCode::NotSupported(
                            "non shared source has no fragments to describe".to_owned(),
                            "Use `DESCRIBE` instead of `DESCRIBE FRAGMENTS`".to_owned(),
                        ));
                    }
                }
                Relation::BaseTable(t) => t.table_catalog.id.as_job_id(),
                Relation::SystemTable(_t) => {
                    bail!(ErrorCode::NotSupported(
                        "system table has no fragments to describe".to_owned(),
                        "Use `DESCRIBE` instead of `DESCRIBE FRAGMENTS`".to_owned(),
                    ));
                }
                Relation::Share(_s) => {
                    bail!(ErrorCode::NotSupported(
                        "view has no fragments to describe".to_owned(),
                        "Use `DESCRIBE` instead of `DESCRIBE FRAGMENTS`".to_owned(),
                    ));
                }

View on GitHub (pinned to 6469eb736d)