use super::catalog::find_parameter;
use super::definition::ParameterFlags;
use crate::SQLError;
#[derive(Clone, Debug, PartialEq)]
pub enum SetArgument {
Integer(i64),
Number(String),
Text(String),
}
pub fn flatten_set_arguments(name: &str, arguments: &[SetArgument]) -> Result<String, SQLError> {
let flags = find_parameter(name).map_or(ParameterFlags::NONE, |definition| definition.flags);
if !flags.contains(ParameterFlags::LIST_INPUT) && arguments.len() != 1 {
return Err(SQLError::Routine {
sqlstate: "22023".into(),
message: format!("SET {name} takes only one argument"),
});
}
let quote = flags.contains(ParameterFlags::LIST_QUOTE);
Ok(arguments
.iter()
.map(|argument| match argument {
SetArgument::Integer(value) => value.to_string(),
SetArgument::Number(text) => text.clone(),
SetArgument::Text(text) if quote => crate::expr::quote_ident(text),
SetArgument::Text(text) => text.clone(),
})
.collect::<Vec<_>>()
.join(", "))
}
#[cfg(test)]
mod tests;