use lazy_static::lazy_static;
pub struct BuiltinFunctionData {
pub name: &'static str,
pub accepts_star: bool,
pub maybe_value: bool,
}
impl BuiltinFunctionData {
pub fn count() -> Self {
BuiltinFunctionData {
name: "COUNT",
accepts_star: true,
maybe_value: false,
}
}
pub fn new(name: &'static str) -> Self {
BuiltinFunctionData {
name,
accepts_star: false,
maybe_value: false,
}
}
pub fn new_maybe_value(name: &'static str) -> Self {
BuiltinFunctionData {
name,
accepts_star: false,
maybe_value: true,
}
}
}
lazy_static! {
static ref BUILTIN_FUNCTIONS: Vec<BuiltinFunctionData> = vec![
BuiltinFunctionData::count(), BuiltinFunctionData::new("SUM"),
BuiltinFunctionData::new("AVG"),
BuiltinFunctionData::new("MIN"),
BuiltinFunctionData::new("MAX"),
BuiltinFunctionData::new("CONCAT"), BuiltinFunctionData::new("UPPER"),
BuiltinFunctionData::new("LOWER"),
BuiltinFunctionData::new("LENGTH"),
BuiltinFunctionData::new("TRIM"),
BuiltinFunctionData::new("SUBSTRING"), BuiltinFunctionData::new("SUBSTR"), BuiltinFunctionData::new("COALESCE"), BuiltinFunctionData::new("NULLIF"),
BuiltinFunctionData::new("IFNULL"), BuiltinFunctionData::new("NOW"),
BuiltinFunctionData::new("DATE"),
BuiltinFunctionData::new("TIME"),
BuiltinFunctionData::new("DATETIME"),
BuiltinFunctionData::new_maybe_value("CURRENT_TIMESTAMP"),
BuiltinFunctionData::new_maybe_value("CURRENT_DATE"),
BuiltinFunctionData::new_maybe_value("CURRENT_TIME"),
BuiltinFunctionData::new("ABS"),
BuiltinFunctionData::new("ROUND"), BuiltinFunctionData::new("CEIL"),
BuiltinFunctionData::new("CEILING"),
BuiltinFunctionData::new("FLOOR"),
BuiltinFunctionData::new("POWER"),
BuiltinFunctionData::new("POW"),
BuiltinFunctionData::new("SQRT"),
BuiltinFunctionData::new("MOD"),
BuiltinFunctionData::new("CAST"), BuiltinFunctionData::new("DISTINCT"),
];
}
pub fn get_builtin_fn(name: &str) -> Option<&BuiltinFunctionData> {
let upper_name = name.to_uppercase();
BUILTIN_FUNCTIONS
.iter()
.find(|func| func.name == upper_name)
}