{"record":{"id":"46c782b18083b5cf","repo":"risingwavelabs/risingwave","slug":"license-feature-check-failed-clickhousesharedengi","errorCode":null,"errorMessage":"license feature check failed (ClickHouseSharedEngine not available): wrapped error from risingwave_common::license::Feature::check_available","messagePattern":"license feature check failed \\(ClickHouseSharedEngine not available\\): wrapped error from risingwave_common::license::Feature::check_available","errorType":"exception","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/clickhouse.rs","lineNumber":581,"sourceCode":"    crate::impl_validate_sink_unknown_fields!();\n\n    async fn validate(&self) -> Result<()> {\n        // For upsert clickhouse sink, the primary key must be defined.\n        if !self.is_append_only && self.pk_indices.is_empty() {\n            return Err(SinkError::Config(anyhow!(\n                \"Primary key not defined for upsert clickhouse sink (please define in `primary_key` field)\"\n            )));\n        }\n\n        // check reachability\n        let client = self.config.common.build_client()?;\n\n        let (clickhouse_column, clickhouse_engine) =\n            query_column_engine_from_ck(client, &self.config).await?;\n        if clickhouse_engine.is_shared_tree() {\n            risingwave_common::license::Feature::ClickHouseSharedEngine\n                .check_available()\n                .map_err(|e| anyhow::anyhow!(e))?;\n        }\n\n        if !self.is_append_only\n            && !clickhouse_engine.is_collapsing_engine()\n            && !clickhouse_engine.is_delete_replacing_engine()\n        {\n            return match clickhouse_engine {\n                ClickHouseEngine::ReplicatedReplacingMergeTree(None) | ClickHouseEngine::ReplacingMergeTree(None) | ClickHouseEngine::SharedReplacingMergeTree(None) =>  {\n                    Err(SinkError::ClickHouse(\"To enable upsert with a `ReplacingMergeTree`, you must set a `clickhouse.delete.column` to the UInt8 column in ClickHouse used to signify deletes. See https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/replacingmergetree#is_deleted for more information\".to_owned()))\n                }\n                _ => Err(SinkError::ClickHouse(\"If you want to use upsert, please use either `VersionedCollapsingMergeTree`, `CollapsingMergeTree` or the `ReplacingMergeTree` in ClickHouse\".to_owned()))\n            };\n        }\n\n        self.check_column_name_and_type(&clickhouse_column)?;\n        if !self.is_append_only {\n            self.check_pk_match(&clickhouse_column)?;\n        }","sourceCodeStart":563,"sourceCodeEnd":599,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/clickhouse.rs#L563-L599","documentation":"If the sink targets a ClickHouse SharedMergeTree (shared tree) engine, RisingWave checks that the ClickHouseSharedEngine license feature is available via risingwave_common::license::Feature::check_available. Without an appropriate enterprise license the check fails and validation aborts with this error.","triggerScenarios":"ClickHouse sink whose target table uses a SharedTree engine (e.g. SharedMergeTree on ClickHouse Cloud) while the RisingWave deployment lacks a license enabling ClickHouseSharedEngine.","commonSituations":"Enterprise/Cloud feature used with an open-source or unlicensed deployment; expired or missing license covering the ClickHouse shared-engine integration.","solutions":["Obtain/install a RisingWave enterprise license that enables the ClickHouseSharedEngine feature.","Switch the ClickHouse table to a non-shared engine (e.g. MergeTree, CollapsingMergeTree).","If the license should cover this, verify license activation and feature availability before creating the sink."],"exampleFix":"// before\n-- target table uses SharedMergeTree with no enterprise license\nCREATE TABLE t (...) ENGINE = SharedMergeTree ...;\n// after\nCREATE TABLE t (...) ENGINE = MergeTree ORDER BY id; -- non-shared engine, no license needed","handlingStrategy":"try-catch","validationCode":"if (clickhouseEngine === 'SharedMergeTree' && !license.features.includes('ClickHouseSharedEngine')) {\n  throw new Error('ClickHouseSharedEngine license feature not available; use a non-shared engine or obtain a license');\n}","typeGuard":null,"tryCatchPattern":"try {\n  await createSink(clickHouseSinkOptions);\n} catch (e) {\n  if (String(e.message).includes('ClickHouseSharedEngine not available')) {\n    // fall back to a non-shared MergeTree table or activate the enterprise license\n  } else throw e;\n}","preventionTips":["Confirm license feature availability before targeting shared-tree engines.","Use standard MergeTree/CollapsingMergeTree engines when licensing is uncertain.","Monitor license expiry in enterprise deployments that rely on ClickHouse shared engines."],"tags":["clickhouse","sink","license","enterprise-feature"],"backgroundTag":"feature-not-enabled","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"}