{"record":{"id":"bf06f21020d1baf6","repo":"risingwavelabs/risingwave","slug":"internal-get-channel-delta-stats-expects-0-or-2-ar","errorCode":null,"errorMessage":"internal_get_channel_delta_stats expects 0 or 2 arguments","messagePattern":"internal_get_channel_delta_stats expects 0 or 2 arguments","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/frontend/src/optimizer/rule/table_function_to_internal_get_channel_delta_stats.rs","lineNumber":103,"sourceCode":"            Field::new(\"backpressure_rate\", DataType::Float64),\n            Field::new(\"recv_throughput\", DataType::Float64),\n            Field::new(\"send_throughput\", DataType::Float64),\n        ];\n\n        // Extract parameters if provided\n        let (at_time, time_offset) = match table_function.args.len() {\n            0 => (None, None), // No default, let the service handle it\n            2 => {\n                let at_expr = &table_function.args[0];\n                let offset_expr = &table_function.args[1];\n\n                let at_time = expr_impl_to_u64_fn(at_expr)?;\n                let time_offset = expr_impl_to_u64_fn(offset_expr)?;\n\n                (at_time, time_offset)\n            }\n            _ => {\n                bail!(\"internal_get_channel_delta_stats expects 0 or 2 arguments\");\n            }\n        };\n\n        // Create a LogicalGetChannelDeltaStats node with the extracted parameters\n        let plan = LogicalGetChannelDeltaStats::new(ctx, Schema::new(fields), at_time, time_offset);\n        Ok(plan.into())\n    }\n}\n\nimpl TableFunctionToInternalGetChannelDeltaStatsRule {\n    pub fn create() -> BoxedRule {\n        Box::new(TableFunctionToInternalGetChannelDeltaStatsRule {})\n    }\n}\n","sourceCodeStart":85,"sourceCodeEnd":118,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/optimizer/rule/table_function_to_internal_get_channel_delta_stats.rs#L85-L118","documentation":"Guard in the table_function_to_internal_get_channel_delta_stats rule: internal_get_channel_delta_stats accepts either 0 arguments (service defaults) or exactly 2 (at_time and time_offset); any other argument count, including 1, fails rule application with this error.","triggerScenarios":"Invoking the table function with 1 argument or 3+ arguments, e.g. `internal_get_channel_delta_stats(60)`.","commonSituations":"Users assuming a single relative-offset form exists, or copy-pasting signatures from other internal table functions.","solutions":["Call with either no arguments: `internal_get_channel_delta_stats()`,","or with exactly two int64 arguments: `internal_get_channel_delta_stats(at_time, time_offset)`.","Check the function's documented signature before calling.","If a one-argument form is needed, request the feature or use the two-argument form with a zero offset."],"exampleFix":"-- before\nSELECT * FROM internal_get_channel_delta_stats(60);\n-- after\nSELECT * FROM internal_get_channel_delta_stats(60, 0);","handlingStrategy":"validation","validationCode":"-- Valid arities only\nSELECT * FROM internal_get_channel_delta_stats();\nSELECT * FROM internal_get_channel_delta_stats(3600, 0);","typeGuard":null,"tryCatchPattern":"// Build-plan errors surface at query time; validate arg count client-side\nif args.len() != 0 && args.len() != 2 {\n    eprintln!(\"internal_get_channel_delta_stats expects 0 or 2 arguments\");\n}","preventionTips":["Call with 0 or 2 arguments only","Never call with a single relative offset argument","Consult the table function signature in docs before use"],"tags":["rust","optimizer","arity","arguments"],"backgroundTag":"missing-required-argument","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}