{"record":{"id":"8647e2c04e980719","repo":"risingwavelabs/risingwave","slug":"expected-string-literal","errorCode":null,"errorMessage":"expected string literal","messagePattern":"expected string literal","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/expr/macro/src/parse.rs","lineNumber":65,"sourceCode":"        } else {\n            args.split(',').map(|s| s.trim().to_owned()).collect()\n        };\n        parsed.ret = ret.trim().to_owned();\n        parsed.is_table_function = is_table_function;\n\n        if input.parse::<Token![,]>().is_err() {\n            return Ok(parsed);\n        }\n\n        let metas = input.parse_terminated(syn::Meta::parse, Token![,])?;\n        for meta in metas {\n            let get_value = || {\n                let kv = meta.require_name_value()?;\n                let syn::Expr::Lit(lit) = &kv.value else {\n                    return Err(Error::new(kv.value.span(), \"expected literal\"));\n                };\n                let syn::Lit::Str(lit) = &lit.lit else {\n                    return Err(Error::new(kv.value.span(), \"expected string literal\"));\n                };\n                Ok(lit.value())\n            };\n            if meta.path().is_ident(\"batch_fn\") {\n                parsed.batch_fn = Some(get_value()?);\n            } else if meta.path().is_ident(\"state\") {\n                parsed.state = Some(get_value()?);\n            } else if meta.path().is_ident(\"init_state\") {\n                parsed.init_state = Some(get_value()?);\n            } else if meta.path().is_ident(\"prebuild\") {\n                parsed.prebuild = Some(get_value()?);\n            } else if meta.path().is_ident(\"type_infer\") {\n                parsed.type_infer = Some(get_value()?);\n            } else if meta.path().is_ident(\"generic\") {\n                parsed.generic = Some(get_value()?);\n            } else if meta.path().is_ident(\"volatile\") {\n                parsed.volatile = true;\n            } else if meta.path().is_ident(\"deprecated\") || meta.path().is_ident(\"internal\") {","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/expr/macro/src/parse.rs#L47-L83","documentation":"Same `get_value()` closure as the \"expected literal\" check, but one level deeper: the value must be a literal AND a string literal (`syn::Lit::Str`). Integers, booleans, chars, or byte strings after an attribute key produce this spanned error.","triggerScenarios":"Writing `#[function(\"sig(int4)\", type_infer = 42)]`, `state = true`, `prebuild = 'c'`, or any non-string literal for keys `batch_fn`, `state`, `init_state`, `prebuild`, `type_infer`, or `generic`.","commonSituations":"Developers passing type identifiers or numeric flags instead of quoted type/function-name strings when declaring function attributes.","solutions":["Wrap the value in double quotes so it is a Rust string literal: `type_infer = \"infer_type\"`.","Check the expected format of each key in existing `#[function]` usages and match it.","If passing a type, express it as a string the macro can parse, e.g. `state = \"MyState\"`."],"exampleFix":"// before\n#[function(\"avg(int4)\", state = MyState)]\n\n// after\n#[function(\"avg(int4)\", state = \"MyState\")]","handlingStrategy":"validation","validationCode":"// Every value for batch_fn/state/init_state/prebuild/type_infer/generic must be a quoted string:\nfn is_string_literal_attr(v: &str) -> bool { v.starts_with('\"') && v.ends_with('\"') }\nassert!(is_string_literal_attr(\"\\\"MyState\\\"\"));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Quote every attribute value: `state = \"MyState\"`, `type_infer = \"infer_fn\"`.","Never pass bare identifiers, numbers, or chars to these keys.","Compare against existing #[function] usages when unsure of the expected format."],"tags":["proc-macro","compile-time","attribute","string-literal"],"backgroundTag":"invalid-argument-value","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"}