risingwavelabs/risingwave · error

ALTER TABLE ALTER WATERMARK is not supported for iceberg tab

Error message

ALTER TABLE ALTER WATERMARK is not supported for iceberg table: {}.{}

What it means

Modifying a watermark definition (`ALTER TABLE ... ALTER WATERMARK`) is rejected for Iceberg-backed tables. Watermarks are part of the table's streaming definition and cannot be changed in place for Iceberg sinks.

Source

Thrown at src/frontend/src/handler/mod.rs:1804

        }
        AlterTableOperation::RefreshSchema => {
            bail!(
                "ALTER TABLE REFRESH SCHEMA is not supported for iceberg table: {}.{}",
                schema_name,
                table_name
            );
        }
        AlterTableOperation::AlterRateLimit(rate_limit)
            if rate_limit.rate_limit_type == AlterRateLimitType::Source =>
        {
            bail!(
                "ALTER TABLE SET SOURCE RATE LIMIT is not supported for iceberg table: {}.{}",
                schema_name,
                table_name
            );
        }
        AlterTableOperation::AlterWatermark { .. } => {
            bail!(
                "ALTER TABLE ALTER WATERMARK is not supported for iceberg table: {}.{}",
                schema_name,
                table_name
            );
        }
        _ => {}
    }
    Ok(())
}

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Recreate the table and Iceberg sink with the desired watermark definition in the DDL and backfill.
  2. Handle late data at the upstream source or query level instead of altering the watermark.
  3. Skip ALTER WATERMARK statements for Iceberg tables in automation.

Example fix

// before
ALTER TABLE iceberg_t ALTER WATERMARK ts_col - INTERVAL '1 minute';
// after
-- recreate table/sink with the new watermark clause at creation
Defensive patterns

Strategy: validation

Validate before calling

-- Do not issue ALTER WATERMARK on iceberg tables
SELECT relation_kind FROM rw_catalog.rw_relations WHERE name = 't';
-- recreate with the desired watermark clause instead

Type guard

fn is_watermark_change(op: &AlterTableOperation) -> bool {
    matches!(op, AlterTableOperation::AlterWatermark {..})
}

Try / catch

match client.alter_table_watermark(table, wm).await {
    Err(e) if e.message().contains("ALTER WATERMARK is not supported for iceberg") => {
        // recreate table/sink with the new watermark definition
    }
    other => other?,
}

Prevention

When it happens

Trigger: Executing `ALTER TABLE <iceberg_table> ALTER WATERMARK ...` (set or reset watermark) on a table backed by an Iceberg sink.

Common situations: Adjusting watermark delay after observing late data; generic ALTER WATERMARK scripts applied to all tables.

Related errors


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