risingwavelabs/risingwave · error

LogicalVectorSearch can only for batch plan, not stream plan

Error message

LogicalVectorSearch can only for batch plan, not stream plan

What it means

Raised in LogicalVectorSearch::logical_rewrite_for_stream: a vector search node appeared in a streaming plan rewrite path, but vector search is only supported in batch queries, so the stream conversion fails with this error.

Solutions

  1. Use this plan node only in batch queries; build a streaming plan without LogicalVectorSearch, or extend the optimizer to support stream generation.
  2. Route vector search workloads through batch query paths.
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at src/frontend/src/optimizer/plan_node/logical_vector_search.rs:269 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at src/frontend/src/optimizer/plan_node/logical_vector_search.rs:269

    }
}

impl PredicatePushdown for LogicalVectorSearch {
    fn predicate_pushdown(
        &self,
        predicate: Condition,
        ctx: &mut PredicatePushdownContext,
    ) -> PlanRef {
        gen_filter_and_pushdown(self, predicate, Condition::true_cond(), ctx)
    }
}

impl ToStream for LogicalVectorSearch {
    fn logical_rewrite_for_stream(
        &self,
        _ctx: &mut RewriteStreamContext,
    ) -> crate::error::Result<(PlanRef, ColIndexMapping)> {
        bail!("LogicalVectorSearch can only for batch plan, not stream plan");
    }

    fn to_stream(&self, _ctx: &mut ToStreamContext) -> crate::error::Result<StreamPlanRef> {
        bail!("LogicalVectorSearch can only for batch plan, not stream plan");
    }
}

impl LogicalVectorSearch {
    pub fn to_top_n(
        input: PlanRef,
        left: ExprImpl,
        right: ExprImpl,
        distance_type: PbDistanceType,
        top_n: u64,
        output_indices: &[usize],
    ) -> LogicalTopN {
        let (neg, expr_type) = match distance_type {
            PbDistanceType::Unspecified => {

View on GitHub (pinned to 6469eb736d)