{"record":{"id":"940db88d90e3197d","repo":"databendlabs/databend","slug":"get-input-read-buffer-size-should-not-fail","errorCode":null,"errorMessage":"get_input_read_buffer_size should not fail","messagePattern":"get_input_read_buffer_size should not fail","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/query/service/src/servers/http/v1/streaming_load.rs","lineNumber":236,"sourceCode":"\n    let settings = query_context.get_settings();\n\n    let mut planner = Planner::new(query_context.clone());\n    let (mut plan, extras) = planner\n        .plan_sql(sql)\n        .await\n        .map_err(|err| err.display_with_sql(sql))\n        .map_err(BadRequest)?;\n\n    let entry = QueryEntry::create(&query_context, &plan, &extras).map_err(InternalServerError)?;\n    let _guard = QueriesQueueManager::instance()\n        .acquire(entry)\n        .await\n        .map_err(InternalServerError)?;\n\n    let input_read_buffer_size = settings\n        .get_input_read_buffer_size()\n        .expect(\"get_input_read_buffer_size should not fail\")\n        as usize;\n\n    match &mut plan {\n        Plan::Insert(insert) => match &mut insert.source {\n            InsertInputSource::StreamingLoad(streaming_load) => {\n                if !streaming_load.file_format.support_streaming_load() {\n                    return Err(poem::Error::from_string(\n                        format!(\n                            \"Unsupported file format: {}\",\n                            streaming_load.file_format.get_type()\n                        ),\n                        StatusCode::BAD_REQUEST,\n                    ));\n                }\n                let (tx, rx) = tokio::sync::mpsc::channel(1);\n                *streaming_load.receiver.lock() = Some(rx);\n\n                let format = streaming_load.file_format.clone();","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/databendlabs/databend/blob/288d84d76e20a2f8f7173bda9691eb6ece301aa9/src/query/service/src/servers/http/v1/streaming_load.rs#L218-L254","documentation":"streaming_load_handler_inner reads the session setting `input_read_buffer_size` via get_input_read_buffer_size(), which returns Result because the setting value must parse as a number. The code expects it to always be valid since defaults are correct; an Err means the setting holds an unparseable/invalid value in the session, so the handler panics with 500.","triggerScenarios":"A session-level or global setting `input_read_buffer_size` was set to a non-numeric or invalid value (e.g. via SET or a connection settings string) before running the streaming load (POST /v1/streaming_load).","commonSituations":"Copy-pasted connection strings with wrong setting syntax; tenants overriding settings with formatted values like '128MB' where a plain integer is required; corrupted settings from older versions.","solutions":["Check the session/global value: `SELECT value FROM system.settings WHERE name='input_read_buffer_size'` and reset it with `SET input_read_buffer_size=<valid integer>`.","Reset to default: `SET GLOBAL input_read_buffer_size = DEFAULT` (or restart session).","Upgrade/patch so get_input_read_buffer_size maps errors to a 400 instead of expect().","Validate any client-supplied settings at connection time."],"exampleFix":"// before\nlet input_read_buffer_size = settings.get_input_read_buffer_size().expect(\"get_input_read_buffer_size should not fail\") as usize;\n// after\nlet input_read_buffer_size = settings.get_input_read_buffer_size()\n    .map_err(|e| HttpErrorCode::bad_request(format!(\"invalid input_read_buffer_size: {e}\")))? as usize;","handlingStrategy":"validation","validationCode":"SELECT value FROM system.settings WHERE name = 'input_read_buffer_size'; -- must be a plain integer","typeGuard":"fn is_valid_buffer_size(v: &str) -> bool { v.parse::<u64>().is_ok() }","tryCatchPattern":"let size = settings.get_input_read_buffer_size()\n    .map_err(|e| HttpErrorCode::bad_request(format!(\"invalid input_read_buffer_size: {e}\")))?;","preventionTips":["Only set input_read_buffer_size to plain integers (no unit suffixes)","Reset suspicious settings to DEFAULT","Validate settings on SET to reject bad values early","Map setting read errors to HTTP 4xx, never expect()"],"tags":["rust","panic","settings","streaming-load","config"],"backgroundTag":"invalid-config-value","analyzedSha":"288d84d76e20a2f8f7173bda9691eb6ece301aa9","analyzedAt":"2026-09-11T11:29:36.208Z","contentChangedAt":"2026-09-11T11:29:36.208Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}