use sqlparser::ast;
use crate::error::Result;
use crate::temporal::TemporalScope;
use crate::types::{SqlCatalog, SqlPlan};
pub(super) fn try_plan_relation(
rel: &ast::TableFactor,
catalog: &dyn SqlCatalog,
temporal: TemporalScope,
) -> Result<Option<SqlPlan>> {
let name = match rel {
ast::TableFactor::Table {
name,
args: Some(_),
..
} => name,
_ => return Ok(None),
};
let fn_name = crate::parser::normalize::normalize_object_name_checked(name)?;
if !is_array_tvf(&fn_name) {
return Ok(None);
}
let twj = ast::TableWithJoins {
relation: rel.clone(),
joins: Vec::new(),
};
super::super::array_fn::try_plan_array_table_fn(std::slice::from_ref(&twj), catalog, temporal)
}
fn is_array_tvf(name: &str) -> bool {
matches!(
name,
"array_slice" | "array_project" | "array_agg" | "array_elementwise"
)
}