use rudb_common::{LogicalType, Result, Value};
use rudb_functions::{FUNCTION_CATALOG, FUNCTION_SCHEMA, function_entries, function_fields};
use rudb_plan::{Plan, Slice};
use crate::metadata::{Metadata, text};
pub(crate) fn functionnames(plan: &Plan, index: u32, columns: Slice) -> Result<Metadata> {
let entries = function_entries();
let mut rows = Vec::with_capacity(entries.len());
for entry in entries {
rows.push(vec![
text(FUNCTION_CATALOG),
Value::Null,
text(FUNCTION_SCHEMA),
text(entry.name),
entry.alias_of.map_or(Value::Null, text),
text(entry.function_type),
Value::Null,
Value::Null,
Value::map(LogicalType::Varchar, LogicalType::Varchar, Vec::new()),
entry.return_type.map_or(Value::Null, text),
strings(&entry.parameters),
strings(&entry.parameter_types),
entry.varargs.map_or(Value::Null, text),
Value::Null,
entry.has_side_effects.map_or(Value::Null, Value::Boolean),
Value::Boolean(true),
Value::Null,
Value::Null,
Value::Null,
entry.stability.map_or(Value::Null, text),
Value::Null,
]);
}
Metadata::new("duckdb_functions", &function_fields(), &rows, plan, index, columns)
}
fn strings(values: &[String]) -> Value {
Value::List {
element: LogicalType::Varchar,
values: values.iter().map(|value| Value::Varchar(value.clone())).collect(),
}
}